- 声明定义抽象类
- 声明定义接口
- 派生类、抽象类、接口的继承要点
public abstract class CRMSystem {
public abstract Client add(Client newGuy); //添加用户方法
public abstract Event add(Event e, Client guy); //重载添加事件、用户方法
public abstract Event[] todayEvents(); //今日事件方法
}
说明: 1.抽象类有构造器 构造器的访问权限可以声明成public/protected/default,但是声明成public没有意义,因为抽象类并不能实例化,所以抽象类的构造器不能被其他类直接调用。即便是子类,子类中除了构造方法以外的方法也是不能调用抽象父类的构造方法的。所以抽象类的构造器只能在子类的构造器中被调用
2.接口和抽象类不能实例化 3.抽象方法所在的类必须是抽象类(接口是纯抽象类) 4.抽象类可以只有抽象方法,没具体方法 5.抽象类可以只有具体方法,没有抽象方法,这样设计的目的就是不让调用者创建该类的实例对象 6.抽象类的类体内容可以为空 7.抽象类中的抽象方法的访问权限修饰符可以是 public
、protected
、default
,但是不可以是 private
。若没有指明访问权限修饰符,默认是default
8.抽象类中可以声明任意类型的变量,不论是静态的还是非静态的;不论是final的还是非final;不论是公开的还是私有的。 9.抽象类会将所有实现接口的所有未实现的抽象方法继承下来,换句话说接口会将所有未被实现的抽象方法继承到其抽象的实现子类中 10.abstract 不能与 final 同时修饰同一个类 11.abstract 不能与 private、static、final、native 同时修饰同一个方法 12.在抽象类中声明一个抽象方法,而该抽象类的父接口也含有相同方法签名的抽象方法,那么该抽象类中的该抽象方法就是覆盖重写父接口中对应的抽象方法,只是没有实现而已
应用场景: 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。如果某个方法在父类中实现并没有任何意义,而是根据子类的实际需求来进行不同的实现,那么就可以将这个方法在父类中声明为 abstract 方法,那么这个父类也就成为 abstract 类了。
声明定义接口public interface CRMSystem {
Client add(Client newGuy);
Event add(Event e, Client guy);
Event[] todayEvents();
// 默认方法,用来升级接口
public default void myMethodDefault() {
...
}
}
说明: 1.接口中声明定义的变量,默认 public static final
,而且必须是 public static final
,其实就是常量,所以必须初始化(即赋值) 2.接口中声明定义的常量会被继承到实现子类中 3.接口中声明的抽象方法必须是 public abstract
的(默认,可以不写),并且不可以是 final,也不可以是 static 4.如果是 Java 8,还可以额外包含默认方法和静态方法,默认方法和静态方法都会被实现子类继承;其实私有方法也会被继承到子类中,只是看不到而已。因为子类对象中有保存父类私有方法的引用地址。
public default 返回值类型 方法名(参数列表) {方法体} // 默认方法,必须是public,默认是public,不可以加static,不可以加final
public static 返回值类型 方法名(参数列表) {方法体} // 静态方法,不可以是protected,默认是public,不可以加final
5.如果是 Java 9,还可以包含私用方法
private 返回值类型 方法名(参数列表) {方法体} // 私有的普通方法,可以加final
private static 返回值类型 方法名(参数列表) {方法体} // 私有的静态方法,不可以加final
6.不能通过实现子类的对象名称调用接口的静态方法,特别注意了。但是却可以通过实现子类的对象名称来访问接口的静态变量(实际上是常量)。因为编译时编译器会将实现子类的对象名称改成实现子类的类名,这样实际上还是通过实现子类的类名去访问静态变量的。 7.接口不可以有静态代码块和构造器 8.接口体的内容可以为空
派生类、抽象类、接口的继承要点1.一个类(不论是具体类还是抽象类)只能继承自一个类(不论是具体类还是抽象类),不可以同时继承自多个类,换句话说一个类的直接父类只能有一个,这叫单继承 2.一个类可以多级继承,例如,A 继承自 B,B 继承自 C 3.一个类可以同时实现多个接口 4.一个父类可以有多个子类,即不同的类可以继承自同一个父类 5.接口可以继承自(extends)另外一个接口,也可以同时继承自多个接口 6.具体的子类如果继承自(extends)一个抽象类,则必须实现抽象类中的全部抽象方法 7.具体的实现子类如果实现自(implements)一个接口,则必须实现接口中的全部抽象方法 8.如果声明的是抽象类,继承自(extends)一个抽象类,则可以实现部分的抽象方法,甚至都不实现也行
9.如果声明的是抽象类,实现自(implements)一个接口,则可以实现部分的抽象方法,也可以都不实现,整个类体空的也可以;也可以实现全部的抽象方法,抽象类中可以没有抽象方法。
10.实现(implements)也是一种特殊的继承关系 11.父类,又叫基类、超类;子类,又叫派生类 12.实现抽象方法,也可以理解为重写(Override)方法 13.子类的成员方法无法直接访问父类的私域(private field) 14.一个具体的实现子类同时实现多个接口时,如果不同接口含有相同方法签名的默认方法,具体类必须重写冲突的默认方法 15.一个具体的实现子类同时实现多个接口时,如果不同接口含有相同方法签名的抽象方法,具体的实现子类只要实现其中一个抽象方法即可 16.一个具体的实现子类的直接父类和接口含有相同方法签名的方法时,通过具体的实现子类对象调此方法,优先使用直接父类的方法 17.子类无法继承父类的构造器 18.子类无法继承父类的私有变量和私有方法(实际已经继承了,只是不可见而已) 19.子类可以继承父类的静态变量和静态方法 20.子类可以继承父类的成员变量和成员方法 21.一个具体类继承自一个抽象类,必须实现抽象类中的全部抽象方法;这个具体类可以叫作抽象类的子类、派生类、实现类;而抽象类可以叫作该具体类的父类、基类、超类。 存疑:A 继承自 B,那么 B 能否叫作 A 的基类、超类呢?