把一个方法声明为abstract,表示它是一个抽象方法,本身没有任何实现语句,只是定义方法签名,让子类去覆写。但抽象方法的类必须得是抽象类。抽象类无法被实例化。
abstract class Person {
public abstract void run();
}
Person p = new Person(); // 编译错误
抽象类
抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的,否则编译会报错。
面向抽象编程的本质就是:
上层代码只定义规范(例如:abstract class Person);
不需要子类就可以实现业务逻辑(正常编译);
具体的业务逻辑由不同的子类实现,调用者并不关心。
接口- 如果一个抽象类没有字段,所有方法全部都是抽象方法,可以把该抽象类改写为接口:interface。
interface Person {
void run();
String getName();
}
- interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的。
在Java中一个类只能继承自一个类,但是一个类可以被多个类继承。而且一个类可以实现多个interface。
class Student implements Person, Run { // 实现了两个interface
...
}
接口继承
一个interface可以继承自另一个interface。
在接口中可以定义default方法。
default方法:当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。(就是本来需要实现每一个接口中的方法,但是default的方法无需去实现)
interface的字段只能是public static final类型
静态字段- 对于静态字段,无论修改哪个实例的静态字段,效果都一样。所有实例的静态字段都会被修改,原因是静态字段并不属于实例。
- 一般最好用类名来访问静态字段。可以把静态字段理解为描述class本身的字段(非实例字段)。
ming.number = 88; System.out.println(hong.number); Person.number = 99; System.out.println(Person.number);



