一、抽象类 方法
1.抽象方法使用规则
- 抽象方法没有方法体
- 含有抽象方法的类必须是抽象类
- 抽象类中可以暂时没有抽象方法
- 抽象类中的抽象方法跟子类有什么联系?
(1) 如果子类完全实现了父类的抽象方法,那么子类可以不用声明为抽象类
(2) 如果子类没有完全实现父类的抽象方法,那么子类必须声明为抽象类
2.抽象类的语法规则
- 被abstract修饰的类是抽象类
- 抽象类中可以有抽象方法,也就是被abstract修饰的方法,也可以没有。
- 抽象方法没有方法体,只有方法声明。
- 子类继承抽象类需要重写父类所有的抽象方法,否则,子类也必须声明为抽象类
- 抽象类有构造方法,但是不能被显示调用,也就是不能实例化,或者说抽象类没有对象。–防止直接调用抽象方法
- 抽象类的构造方法只在子类实例化时隐式调用。
- 抽象类的使用一般是作为引用类型,指向非抽象的引用实例,体现出多态。
- 构造方法和静态方法都不能(abstract)抽象修饰
静态方法不能被子类覆盖(重写),一旦声明为抽象方法 将永远没有具体的实现
public abstract class FoolishMan {
public abstract void moveMoutain();
public abstract void fillOcean();
}
public abstract class Zi1 extends FoolishMan{
}
public abstract class Zi2 extends Zi1{
@Override
public void moveMoutain() {
System.out.println("第三代完成了移山");
}
}
public class Zi3 extends Zi2{
@Override
public void fillOcean() {
System.out.println("完成了填海");
}
}
public class TestFool {
public static void main(String[] args) {
//抽象类有构造方法,但是不能被显示调用,也就是不能实例化,
// 或者说抽象类没有对象。--防止直接调用抽象方法
Zi3 z3 = new Zi3();
z3.fillOcean();
z3.moveMoutain();
}
}
完成了填海
第三代完成了移山
二、接口
接口的含义:
接口就是提供一种统一的“协议”,而接口中的属性也属于“协议”中的成员.它们是公共的,静态的,最终的常量.相当于全局常量。
抽象类是不完全的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满足具体的实现.
接口的语法规则
-
定义一个接口:
public interface 接口名{} -
接口的成员:
成员属性:public static final (公共的静态常量)类型
成员方法:public abstract (公共的抽象方法) 或静态方法
无实例方法 -
接口的应用理解:
接口可以理解为定义的一组通用的组件,或者是对外提供服务的功能模块,具体可替换,可拆卸的特点。接口比抽象类更抽象,已经完全抽象得没边没影。
接口通常作为实体类的成员属性,和实体类是附属关系,而不是包含关系。
1.为什么接口中的属性是静态的常量?
(1) 首先接口由于少了方法的实现,所以不能实例化,这个与抽象类一致,
(2) 由于不能实例化,所以对于成员变量只能是static
(3) 由于是static所以所有实现了接口的类共享一份
(4) 由于所有人共享一份,同时接口的定义是“所有实现该接口的人都共同拥有这些属性/功能”
(5) 由于所有的实现类都共同拥有,若是变量则实现类A的改变会导致实现B的改变
(6) 会由于实现类的操作而改变的东西违反了接口的定义
(7) 所以为了确保每个实现的接口都共同遵守这个“属性”,属性必须是final
(8) 由于接口本身的定义是public,最后就是 public static final xxx
public class Printer {
private InkBox inkBox;
private Paper paper;
public InkBox getInkBox() {
return inkBox;
}
public void setInkBox(InkBox inkBox) {
this.inkBox = inkBox;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public void show(){
System.out.println("使用"+inkBox