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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张健 中级黑马   /  2012-5-24 19:08  /  2356 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

接口与抽象类分别在什么情况下使用?
什么情况下用接口比较好,什么情况下用抽象类比较好?

7 个回复

正序浏览
一、接口只有方法的定义,没有方法的实现,不能加大括号(这样表示方法空实现)。实现接口的类必须把接口的所有方法全部都要实现。

二、抽象类有抽象方法,可以没有抽象方法(抽象方法不能有方法实现)。也可以有完整的方法实现。抽象类、抽象方法的表示前面加abstract,继承抽象类的子类 必须把抽象类的抽象方法全部要实现。有抽象方法的类必须在class前加abstract。

三、接口与抽象类不能实例化对象,

四、一个类可以实现多个接口,必须把所以的接口内的方法全都实现。一个类只能继承单个抽象类。

五、经常把常用的变量,定义在接口中,已经程序暗地里认为是static,而且是final,作为全局变量。不能用private修饰,

六、一个接口不能继承其他类,可以继承接口。一个类如果实现了有继承关系的接口,必须把这个继承关系的接口的,所有方法都要实现。

七、程序运行之前绑定或者赋值,由编译器和连接程序实现。又叫静态绑定,如static方法和final方法,private方法也是,因为它是隐式final。

后期绑定:运行时根据对象的类型进行绑定,由方法调用机制实现,又叫动态绑定。如多态,都是运行时才确定哪个类。

八、父类的某个方法不希望被子类覆盖,或者某个变量不被子类修改,用final在父类把这个方法或者变量修饰。如果final修饰类,表示该类不能被继承。***final修饰的变量必须赋初始值。

回复 使用道具 举报
我们设计程序的时候,用的最多的往往是接口,也提倡基于接口的编程;

而抽象类却不常用,既然有抽象类,那么就一定有它的用处。
抽象类必须通过继承才能调用它的方法吧 因为它不能实例化 这样一来继承它的第一个具体子类还必须设计它的抽象方法
而需要使用接口内的方法就只要在类里面定义接口变量用.直接调用就可以了。

抽象类可以有具体方法和抽象方法,这是和接口的区别,也因为这个区别抽象类和接口有不同的应用场景。
例如“动物”你是用接口来描述还是抽象类来描述?都可以,如果你的需求中“动物”的子类有很多共性的方法,那么你可以用抽象类来描述。如果你的需求中“动物”的子类没有共性方法,那么就用过接口定义不同的方法让子类去实现就可以了。

回复 使用道具 举报

简单来说
抽象类 可以定义抽象未实现方法 和 不抽象但实现方法
abstract class AB{
abstract void show();   //抽象未实现
public void show2(){    //不抽象但实现
  System.out.println("show2().....");
}
}
而接口类 就只能定义未实现方法,让子类去实现,默认方法都是抽象的;
interface AB2{
public void show();
public void show2(); //都未实现
}
使用看需求而定 想要子类全部去实现 就定义接口比较好;而有些方法不需要子类实现,需要子类使用父类(继承)就使用抽象比较好;
回复 使用道具 举报
抽象类和接口异同:
相同:
1,都可以在内部定义抽象方法。
2,通常都在顶层。
3,都不可以实例化,都需要子类来实现。

不同点:
1,抽象类中可以定义抽象方法和非抽象方法,
        而接口中只能定义抽象方法。
2,接口的出现可以多实现。
        抽象类只能单继承。
        也就是说:接口的出现避免了单继承的局限性。
3,继承和实现的关系不一致。继承:is a,实现:like a
综上所述:
如果你想定义的方法全部都是抽象方法那么用接口,否则用抽象类.
而且接口可以多实现,对类的单继承进行了改良.
其实各有利弊,看自己权衡.
回复 使用道具 举报
抽象类抽象类是被abstract修饰的类,不允许被实例化的;抽象方法是没有方法体的方法。抽象类可以不包括抽象方法,它反正不会去实例化,里面的方法是不是抽象的没有本质影响。但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?也就是说含抽象方法的类必须是个抽象类。如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法。
接口
1, Java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承.

2, 与Java接口相关的设计模式:

1, 定制服务模式

设计精粒度的接口,每个Java接口代表相关的一组服务,通过继承来创建复合接口

2, 适配器模式

当每个系统之间接口不匹配时,用适配器来转换接口

3, 默认适配器模式

为接口提供简单的默认实现

4, 代理模式

为Java接口的实现类创建代理类,使用者通过代理来获得实现类的服务

5, 标识类型模式

用接口来标识一种没有任何行为的抽象类型

6, 常量接口模式

在接口中定义静态常量,在其它类中通过import static语句引入这些常量

Java接口的特征归纳:

1, Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)

2, Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化  

public interface A     {      int CONST = 1; //合法,CONST默认为public,static,final类型      void method(); //合法,method()默认为public,abstract类型      public abstract void method2(); //method2()显示声明为public,abstract类型     } 3, Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法

public interface A    {     int var; //错,var是常量,必须显示初始化      void method(){...};   //错,接口中只能包含抽象方法     protected void method2(); //错,接口中的方法必须是public类型     static void method3(){...};   //错,接口中不能包含静态方法    } 4, 接口中没有构造方法,不能被实例化

public interface A    {     public A(){...}; //错,接口中不能包含构造方法     void method();    } 5, 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口


public interface A   {    void methodA();   }   public interface B   {    void methodB();   }   public interface C extends A, B   //C称为复合接口   {    void methodC();   }   public interface C implements A{...}   //错
6, Java接口必须通过类来实现它的抽象方法

public class A implements B{...}

7, 当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的

8, 不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

public class B implements A{}     A a = new B(); //引用变量a被定义为A接口类型,引用了B实例     A a = new A(); //错误,接口不允许实例化 9, 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

public class A extends B implements C, D{...} //B为class,C,D为interface

4, 通过接口,可以方便地对已经存在的系统进行自下而上的抽象,对于任意两个类,不管它们是否属于同一个父类,只有它们存在相同的功能,就能从中抽象出一个接口类型.对于已经存在的继承树,可以方便的从类中抽象出新的接口,但从类中抽象出新的抽象类却不那么容易,因此接口更有利于软件系统的维护与重构.对于两个系统,通过接口交互比通过抽象类交互能获得更好的松耦合.

5, 接口是构建松耦合软件系统的重要法宝,由于接口用于描述系统对外提供的所有服务,因此接口中的成员变量和方法都必须是public类型的,确保外部使用者能访问它们,接口仅仅描述系统能做什么,但不指明如何去做,所有接口中的方法都是抽象方法,接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量.

比较
都不能被实例化,都包含抽象方法。一个类只能继承一个类,即只能有一个父类,但可以实现多个接口。抽象类有默认的构造函数,但接口没有构造函数,否则当子类实现多个接口时,该初始化哪个构造函数?抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是public static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是 abstract的。接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
回复 使用道具 举报
1、抽象类可以提供成员的实现细节,而接口不能。设计抽象时如果要求提供成员的实现细节请选择抽象类。
2、如果设计抽象时选择抽象类,在以后的版本中可以随意为抽象类添加新成员。而接口在这方面就没那么灵活,只有修改现有代码才能添加成员。
3、一个类可以同时实现多个接口,但只能继承一个抽象类,如果要实现类似于多重继承的效果请选择接口。
两者区别的总结:
接口中的所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
接口里面全部没有方法体,全部都是抽象函数,所以当你只想定义规则,不想去实现方法的话就用接口来定义,就像你要做一个公司,你想定义一个上班标准,你跟下属说一句话,给我个上班标准,然后你不用管下属怎么做了,反正不用你管,你只要他们做什么事而已
抽象类呢,就比接口好一点,你可以把他比作项目经理吧!!因为他里面可以有未实现方法体的抽象方法,也可以有实现了方法体的方法,也就是说他不仅要定标准,也要自己实现一部分功能~~~这时候就得用抽象类了!~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马