Java基础(面向对象二)
抽象类:
有时候由于子类必然覆写父类中的某些方法,所以父类中方法体的定义略显多余。
而如果去掉父类的方法体,会导致编译错误。
如果整个去掉父类的方法又使子类失去了多态的特性(继承自同一父类的子类在调用同一方法时执行不同的逻辑)。
因此可用abstract用来修饰父类及父类中的方法,此时方法不能写方法体,只用来让子类继承并覆写。
子类必须覆写父类中的abstract方法。
抽象类的其余使用方法皆同普通类(构造方法)。
抽象类可继承抽象类,然后继续添加抽象方法。
1 public class Demo { 2 public static void main(String[] args) { 3 Person[] arr = { 4 new Worker("worker"), 5 new Student("student"), 6 // new Person() 7 new Student1("student1") 8 }; 9 for(Person i:arr){ 10 i.run(); 11 } 12 } 13 } 14 15 //定义第一抽象类 16 abstract class Person { 17 protected String name; 18 public Person(String name){ 19 this.name = name; 20 } 21 public abstract void run(); 22 } 23 //继承自第一抽象类的子类 24 public class Student extends Person { 25 public Student(String name){ 26 super(name); 27 } 28 @Override 29 public void run(){ 30 System.out.println(this.name+".run"); 31 } 32 } 33 //继承自第一抽象类的子类 34 public class Worker extends Person { 35 public Worker(String name){ 36 super(name); 37 } 38 @Override 39 public void run(){ 40 System.out.println(this.name+".run"); 41 } 42 } 43 //继承自第一抽象类的抽象类 44 abstract class Person1 extends Person { 45 public Person1(String name){ 46 super(name); 47 } 48 abstract void study(); 49 50 } 51 //继承自第二抽象类的子类 52 public class Student1 extends Person1 { 53 public Student1(String name){ 54 super(name); 55 } 56 public void run(){ 57 System.out.println("Student1.run"); 58 } 59 public void study(){ 60 System.out.println("Student1.study"); 61 } 62 }