public class Hello { public static void main(String[] args) { Person p = new Student(); p.run();//Student is running Person.run2(); p.run1(); } } // 抽象类中可以存在实例方法,静态方法,实例字段,他可以存在已经实现的方法然后被子类继承 // 他的抽象方法有点像是接口中的未实现方法,相当于一个约定,约定了他的子类必须实现抽象类中的抽象方法 // 抽象类和接口的不同之处在于一个类可以实现多个接口,但是抽象类只能是单继承的 // 抽象类中可以有实例成员,静态成员,子类继承他会拥有这些成员,但是接口不存在实例成员和静态成员 // 接口只是一个约定而已 abstract class Person { public abstract void run(); public String name; public void run1() { System.out.println("run1"); } public static void run2() { System.out.println("run2"); } } class Student extends Person{ public void run() { System.out.println("Student is running"); } }
类中只要有抽象放啊(abstract)方法就类也就是抽象方法,这个类也必须是抽象类。抽象类不可以被实例化。
抽象类会强迫子类去实现父类(抽象类)中的方法,因此,抽象方法实际上相当于定义了“规范”。
这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。
面向抽象编程的本质就是:
-
上层代码只定义规范(例如:
abstract class Person
); -
不需要子类就可以实现业务逻辑(正常编译);
-
具体的业务逻辑由不同的子类实现,调用者并不关心。