Java 抽象类和接口
一、抽象类
子类的不断具体化,使得父类经常被设计得非常抽象,以至于没有具体的实例与之对应。
抽象类有属性和方法,但无法通过new创建实例。
1、抽象方法
抽象方法只有方法声明,没有方法体的方法。它的实现由子类提供
包含抽象方法的类必须是抽象的,但是也允许声明没有抽象方法的抽象类。
而非抽象类不能有抽象方法,同时,从抽象父类派生的子类如果不能实现所有的抽象方法,它也必须声明为抽象的。
子类可以是抽象的,即使它的父类是具体的。
抽象类可以定义构造方法,且能被子类在构造方法中调用。
2、抽象类的实例化
通常,在抽象父类中声明子类的公共方法接口,调用者只需要了解抽象类的方法接口,就能知道子类的行为能力。
3、final的作用
有时候不希望类被其他子类派生或修改,可以用final关键字实现。
final修饰的类不能被派生~
final修饰方法,禁止子类重写。
二、继承与组合
继承是强耦合关系,父类变,子类必须变。而且继承破坏了封装。
所以实践中,慎用继承,尽量选择组合。
1、什么是组合?
在新类里创建已有类的对象。(依赖)表达的是包含关系
UML图,实线,实心菱形(主体类)
2、用继承还是组合?
考虑是否要从新类上转型回父类,若必须上溯,则需要使用继承。否则应该谨慎,防止继承滥用。
三、接口(interface)
Java中,单继承使得类层次结构更加清晰、易于管理。
但是一个类可以实现多个接口。类通过暴露方法实现与外界的交互,这些方法形成和外部世界的规约。
1、理解接口
接口,像是一种特殊的抽象类,通过一组空的方法体的方法来声明需求。
类若是实现了接口,就承诺了它会实现的行为。
这样,接口构成了类和外部世界之间的契约,并且该契约在编译时由编译器强制检查。即接口中定义的所有方法都必须出现在其源代码,否则就不能成功编译。
不同的类通过实现相同的接口而建立了联系。
2、接口的定义
接口的访问修饰符:public表明任意类和接口都能使用该接口;deafult表明只有定义在同一个包中的类和接口可以使用
接口中的属性:默认被public static final修饰,不能被其他修饰符修饰
接口中的方法:
-
- 定义在接口中的方法默认为public abstract,也不能被其他修饰符限定;
- 接口可以继承多个父接口,也能隐藏父接口的属性,覆盖父接口的方法;
- 只进行方法声明,没有实现。但是Java 8后可以有default方法的实现;
3、接口的实现
implements声明要实现的接口,意味着遵循某个契约!
UML中,类与接口实现关系用带空心三角形的虚线表示。
实际中,通过接口实现多态比基于继承实现多态应用地更加广泛!!慎用继承!
4、接口的特性
一个接口,可以继承多个接口,Interface3 Extends Interface0, Interface1, interface……(可能是因为接口中的方法都是抽象方法,且只有方法声明,所以不存在选择哪一个父接口中的方法继承的问题)。
一个类可以实现多个接口,这弥补了Java单继承的缺陷。(这时要避免多个接口中有方法同名)
接口不是类,当然不能实例化,但是接口可以作为一种引用类型(即接口变量),指向实现了这个接口的类的对象!这就是上节所说的用接口方式实现多态吧,也就是说,可以通过接口变量调用不同的对象的接口方法(当然是实现了该接口的类的实例)。如下例:
public class InterfaceDemo { public static void main(String[] args) { Dog dog=new Dog(); Cat cat=new Cat(); Animals animals=dog; dog.talking(); animals=cat; animals.talking(); } } interface Animals{ void talking(); } class Dog implements Animals{ public void talking(){ System.out.println("Dogs:wang~wang~"); } } class Cat implements Animals{ public void talking(){ System.out.println("Cats:mua~mua~"); } }
5、使用接口注意的点:
- 接口中的方法的访问权限默认为public;
- 接口中声明的属性,为public static final,它可以通过实现了该接口的类的类名访问;
- 接口中没有方法实现,Java 8后可以有缺省实现;
- 实现接口的非抽象类,必须实现该接口也的全部方法;但是抽象类不用全部实现;
- 接口变量,必须指向一个实现了该接口的类的对象;
- 可以用instanceof操作符检查一个对象是否实现了某个特定的接口
- 实现多接口时,一定要避免方法名的重复
6、接口设计
接口隔离原则,是接口设计的一个核心原则,是接口设计的最佳实践。
- 使用多个专门的接口比使用单一的总接口要好;
- 一个类对另一个类的依赖性应当是建立在最小接口上;
四、接口和抽象类比较
抽象类和接口是Java中的双骄,相辅相成又各司其职。
接口和抽象类的不同表现在下面三个方面:
(1)抽象层次不同
抽象类是对整个类的整体进行抽象,包括属性、行为,接口只对行为抽象。
(2)建模关系不同
抽象类对有相似特点的类建模,体现的更多是一种继承关系。而接口可以对不相关的类建模。
(3)设计层次不同
抽象类是自下而上进行设计;接口只需要定义一个规则。