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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田磊阳 金牌黑马   /  2013-3-28 10:15  /  2207 人查看  /  4 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。

1、Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。
如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。

2、一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。
在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。

3、从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。

4、结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。
在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。

Java接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。

使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而不要用具体Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。

我想,如果你编的代码里面连一个接口和抽象类都没有的话,也许我可以说你根本没有用到任何设计模式,任何一个设计模式都是和抽象分不开的,而抽象与Java接口和抽象Java类又是分不开的。

理解抽象,理解Java接口和抽象Java类,我想就应该是真正开始用面向对象的思想去分析问题,解决问题了吧。

4 个回复

倒序浏览
接口和抽象类的不同点有:  

(1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态(static)的常量(final)。
  

(2)抽象类可以有非抽象方法,而接口只能有抽象方法。
  

java中,类与类之间是不能多继承的。java之所以禁止类与类之间的多继承是因为多继承有很大的缺点。
  

多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:
  

(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。例如:
  

类ClassA:
  

Java代码

  public class ClassA {
  protected int varSame = 0 ;
  }

  类ClassB:
  Java代码
  public class ClassB {
  protected int varSame = 1 ;
  }

  子类ClassC:(假设允许类与类之间多继承)
  Java代码
  public class ClassC extends ClassA, ClassB {
  public void printOut() {
  System.out.println( super .varSame);
  }
  public static void main(String[] args) {
  ClassC classC = new ClassC();
  classC.printOut();
  }
  }

  上面程序的运行结果会是什么呢?输出0还是1?
  

(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。例如:

  类ClassA:
  Java代码
  public class ClassA {
  public void printOut() {
  System.out.println( 0 );
  }
  }

  类ClassB:
  Java代码
  public class ClassB {
  public void printOut() {
  System.out.println( 1 );
  }
  }

  子类ClassC:(假设允许类与类之间多继承)
  Java代码
  public class ClassC extends ClassA, ClassB {
  public static void main(String[] args) {
  ClassA classA = new ClassC();
  classA.printOut(); // ------------------------- A行
  ClassB classB = new ClassC();
  classB.printOut(); // ------------------------- B行
  ClassC classC = new ClassC();
  classC.printOut(); //------------------------- C行
  }
  }
  

上面程序的运行结果会是什么呢?A、B、C三行的输出是0还是1?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 赞一个!

查看全部评分

回复 使用道具 举报
田磊阳 发表于 2013-3-28 10:17
接口和抽象类的不同点有:  

(1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态( ...

不错,我也把自己的总结奉上吧,希望大家能学到更多:
http://bbs.itheima.com/thread-38062-1-1.html
回复 使用道具 举报
收藏{:soso_e113:}
回复 使用道具 举报
过来学习之,有重点讲解内部类的吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马