JAVA基础复习总结---------接口与抽象类小结

1.接口

绪论

接口是用来描述类具有什么功能,而并不给出每个功能的具体实现,一个类可以实现多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。---《Java核心技术卷1》

核心要点

上面的绪论几乎就将接口的核心知识概括完了。所以这里是一个详解。

  1. 描述。
    1. 接口不是类,是类型(typing)。类也是类型。
      1. 接口中不能实现任何方法,default 关键字是默认方法,不是实现。
      2. 接口没有构造器。所以不能使用 new 运算符实例化一个接口.
      3. 尽管不能构造接口的对象,却能声明接口的变量:接口变量必须引用实现了接口的类对象。
    2. 接口一定需要别的类实现,才能起到描述作用,所以导致了:
      1. 接口的修饰符只有以下几种:public,abstract,default(缺省(默认)情况下为 public),static,strictfp
      2. 接口中所有的域都是常量。所以域只能使用public static final。(注:现在已经拥有了Enum类,所以如果可以不要把常量写在接口中)
    3. 所有的方法自动属于public abstract(注:尽管如此,实现接口的类依然中的方法必须要把方法声明为public)
  2. 接口的优点在于可以实现多个接口,这样是对多重继承的一种更好的替代品(毕竟C++中的多重继承给了程序员一个非常大的打击。)

注意的地方

  • 接口中的默认方法
    • 默认方法必须使用 default 去实现。
    • 如果你在某个类实现了两个含有相同的方法的接口,并且其中一个方法拥有默认实现,那么就会出现接口冲突,编译器会报错提醒你去解决。
  • 虽然我们允许接口中增加静态方法,但是因为这有违于接口作为抽象规范的初衷,所以Java类库将静态方法放在了伴随类中。
    •   如:Path/Paths,Collection/Collections(加了一个s)
    •   但是,现在既然允许了接口中添加静态方法,那么我们自己的代用就弃用了伴随类。
  • 超类优先原则
    •   如果一个类的父类和实现的接口中有相同的方法(名字,参数,签名),那么优先使用超类的方法。
    •        所以千万不要在你的接口中定义:toString()之类的Object拥有的方法,因为绝对会被覆盖掉。
  • 接口可以帮你实现完全解耦
    •   

2.抽象类

抽象类是由abstract修饰符修饰的类,而抽象方法必须在抽象类中。

抽象方法

  抽象方法:拥有abstract修饰符,并且权限只有public(当我们不写public时,会自动添加一个public,所以protected和private 都不能修饰抽象方法)

public abstract class absClass {
    abstract void absMethod();
}

   在接口中也可以包含抽象方法(接口内部只有抽象方法),但是接口不是类,所以能包含抽象方法的类只有抽象类。

抽象类

  抽象类与普通类的比较:

1)抽象方法必须为public 或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省(default)情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

 

  抽象类与接口的比较

  

但是抽象类和接口有很多有意思的异同点。

  • 接口不是类,但是抽象类是类。虽然二者都不可以被初始化。
  • 接口是对行为的抽象,抽象类是对类的抽象。也就是接口抽象的更为彻底。
  • 抽象类作为很多子类的父类,它是一种模板式设计。接口是一种行为规范,它是一种辐射式设计。
  • 抽象类除了抽象方法外和普通类没有区别,而接口则根本就不是类
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的,原因同上一条
  • 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;原因同上上一条
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 综上,抽象类是抽象弱化版的接口,接口是抽象强化的抽象类。当然我们可以这样心里想想,不可以告诉其他人,因为漏洞百出。

总结:

  • 任何抽象性都应该是应真正的需求而产生的
  • 恰当的原则应该是优先选择类而不是接口
  • 接口是一种重要的工具,但是容易被滥用

相关知识点:

lambda 表达式:

内部类:

 

posted @ 2018-09-30 18:51  过道  阅读(259)  评论(0编辑  收藏  举报