A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 叶久瑞 中级黑马   /  2012-8-9 18:52  /  1629 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

抽象类和接口有什么区别,一般使用的时候该怎么用呢?描述的时候该用哪个?分的不是那么清晰。
abstract class AbsDemo
{
        abstract void show();
        abstract void method();

}


/*
接口定义的格式:
interface 接口名{接口内容}

*/
interface Inter
{
       
        public static final int NUM = 3;
        public abstract void show();
//        public abstract void method();


}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

7 个回复

正序浏览
这是张孝祥老师最详细的解释,希望对你有帮主

含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

     接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

  下面接着再说说两者在应用上的区别:

     接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:

public abstract class BaseServlet extends HttpServlet

{

public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException

{

记录访问日志

进行权限判断

if(具有权限)

{

try

{

doService(request,response);

}

catch(Excetpion e)

{

记录异常信息

}

}

}

protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException;  

//注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的

}



public class MyServlet1 extends BaseServlet

{

protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException

{

本Servlet只处理的具体业务逻辑代码

}



}

     父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。

     备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。
回复 使用道具 举报
抽象类和接口:
1, 抽象类和接口都代表系统的抽象层;
2, 抽象类和接口都不能被实例化,但都可以继承或者实现抽象类或者接口的具体类,通过定义引用变量来构造;
3, 抽象类和接口都包含抽象方法;
4, 抽象类中可以为部分方法提供默认的实现,可以避免子类中重复实现它们,提高代码的可重用性,接口中只能包含抽象方法;
5, 一个类只能继承一个直接的父类,比如抽象类,但是可以实现多个接口。
6,接口可以对外公开,这样就不会破坏面向对象编程的封装性;
7,抽象类是父类的扩展,也就是说当别人定义了一个抽象类里面方法你可以重写覆盖,重载。
区别:
1、抽象类只能被单继承、接口可以被多实现,避免了单继承的局限性。
2、抽象类中可以定义抽象方法,和非抽象方法,它可以用于定义体系的基本共性的内容。接口中只能定义抽象方法,它主要用于对象的功能的扩展。
3、抽象类是继承关系,是is a关系,接口是实现关系是like a关系。
4、抽象类中的成员修饰符都是自定义的,接口中的修饰符都是固定的。

希望对你有所帮!!!{:soso_e100:}
回复 使用道具 举报
abstract
  修饰类:不能用new 实列化一个abstract 对象
           但可以声明成一个抽象类的变量
              
  修饰方法: 没有方法体,以分号结束
                  子类如果是抽象类,可以不实现;如果子类不是抽象类,一定要实现抽象方法
                  如果一个类里有一个抽象方法,此类必为抽象类
                  如果一个类是抽象类,里面的方法可以不为抽象方法
     abstract 修饰的方法必须放在abstract 修饰的类中

      
Interface
  用interface来定义一个接口
  里面的方法都没有方法体
  所有的方法和属性的修饰符只能是 public或不写(默认public)
  接口里能定义属性
  用implements来实现一个接口
  一个类可以实现多个接口
  实现类“继承”接口的属性
  实现类里要实现接口中的所有方法
  接口不能用new 来实例化
  但可以声明一个接口变量
回复 使用道具 举报
本帖最后由 戎石锁 于 2012-8-9 19:12 编辑

interface:
首先是申明一个接口,关键字:interface,语法:
public interface InterfaceDemo
{
....
}
在主体内部可以定义一些常量和接口的申明!例如:
public interface InterfaceDemo
{
public static int a=14;

public void run(int x);
}
需要注意一点:接口中申明的所有方法必须是public或者是默认类型!
而且只要申明,不要去实现它!

如果要使用这个接口,那就要写一个类去实现它,关键字:implements

public class zi implements InterfaceDemo{
.......
}

注意:要去实现一个接口的时候,必须去实现接口中定义的所有方法,除非你的类申明为abstract(是一个抽象类)!

一个类可以实现多个接口,语法就是在要实现的接口之间用","隔开!
public class zi implements InterfaceDemo1,InterfaceDemo2,....
{
....
}

abstract:
abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),
表示其为抽象成员,abstract 不可以和 static 、virtual 一起使用. 声明为 abstract 成员可以不包括实现代码,
但只要类中还有未实现的抽象成员(抽象方法),那么这个类就是一个抽象类,抽象类的对象就不能被实例化,
通常用于强制继承类必须实现某一成员.抽象类是必须要派生子类的。并且,如果子类没有实现抽象基类的所有方法,
则子类也成为一个抽象类。

public abstract class AbstractClass
        {   
        public void test1(){}// 一个正常的方法     
        public abstract void test2(); // 一个抽象方法。   
        }   
如果JAVA类的任何一个方法是abstract的,则类本身必须是abstract的。
回复 使用道具 举报
叶久瑞 发表于 2012-8-9 19:08
已解决,谢谢哦

不客气:loveliness:
回复 使用道具 举报
杨彪 发表于 2012-8-9 18:55
A:抽象类被继承是单继承的关系。
  接口被实现,可以使多实现的关系。
B:接口的出现避免了单继承的局限性。 ...

已解决,谢谢哦
回复 使用道具 举报
A:抽象类被继承是单继承的关系。
  接口被实现,可以使多实现的关系。
B:接口的出现避免了单继承的局限性。
C:抽象类中的成员:
  成员变量:可以使常量也可以使变量。
  成员方法:可以是抽象方法,也可以不是抽象方法。
  构造方法:有构造方法。用于子类实例化使用。
  接口中的成员:
  成员变量:是常量。默认修饰 public static final
  成员方法:都是抽象方法。默认修饰 public abstract
D:抽象类体现的是体系中的共性内容。
  接口体现的是体系中的扩展功能。
E:抽象类被继承是”is a”的关系:xx是yy的一种。
  接口被实现是”like a”的关系:xx像yy的一种。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马