抽象类的作用类似“模板”,可以根据它的格式来修改、创建新的类;但是不能直接由抽象类创建对象只能通过抽象类派生出新的类,再由它来创建对象;抽象类的使用同样是单继承,即一个子类只能继承一个抽象类
抽象类的定义及使用规则:
- 包含一个抽象方法的类必定是抽象类
- 抽象类和抽象方法都要使用abstract关键字声明
- 抽象方法只用声明不用实现
- 抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法
抽象类的定义格式:
1 abstract class 抽象类名称{2 属性;3 访问权限 返回值类型 方法名称(参数){ //普通方法4 [return 返回值];5 }6 访问权限 abstract 返回值类型 方法名称(参数); //抽象方法7 }
从上述格式中看出,抽象类的组成比普通类多了静态方法,其他地方和普通类基本一致
1 abstract class A { 2 public static final String FLAG="China"; 3 private String name = "张三"; 4 public String getName() { 5 return name; 6 } 7 public void setName(String name) { 8 this.name = name; 9 }10 public abstract void print(); //定义抽象方法11 }12 class B extends A{ //继承抽象类,覆写全部抽象方法13 @Override14 public void print() {15 System.out.println("FLAG="+FLAG);16 System.out.println("姓名:"+super.getName());17 }18 }19 public class Demo1 {20 public static void main(String[] args) {21 B b=new B();22 b.print();23 }24 }
从上面的示例中可以看出,抽象类A中定义了抽象方法print(),但是抽象方法并不能被外部直接调用,类B继承类A,并覆写了抽象类A的print()方法;不过需要注意几点:
- 抽象类不能用final关键字声明,因为final关键字声明的类子类不能继承,而抽象类必须被子类覆写
- 抽象方法不要使用private修饰,同样因为子类必须覆写抽象方法,如果使用则无法覆写
抽象类使用的依然是类的继承关系,存在构造方法和各个属性,所以子类实例化之前必须先对父类进行实例化
抽象类中定义了抽象方法,但是定义的抽象方法不能被外部直接调用;在子类对象实例化前同样也会默认调用父类中的无参构造也就是说此时子类实际隐含了一个super关键字调用构造方法的语句:
1 class B extends A{ 2 public B() {3 super(); //隐含此语句4 System.out.println("B、子类中的构造方法");5 }6 }
既然可以调用抽象类中的构造方法,那么也可以直接在子类指定调用父类中的指定参数的构造方法:
1 abstract class Person { 2 private String name; 3 private int age; 4 public Person(String name, int age) { 5 super(); 6 this.name = name; 7 this.age = age; 8 } 9 public String getName() {10 return name;11 }12 public void setName(String name) {13 this.name = name;14 }15 public int getAge() {16 return age;17 }18 public void setAge(int age) {19 this.age = age;20 }21 public abstract String getInfo(); //取得信息,抽象方法22 }23 class Student extends Person{24 private String school;25 public Student(String name, int age, String school) {26 super(name, age);27 this.school = school;28 }29 public String getSchool() {30 return school;31 }32 public void setSchool(String school) {33 this.school = school;34 }35 @Override36 public String getInfo() { //覆写抽象类中抽象方法37 return "姓名:"+super.getName()+38 "年龄:"+super.getAge()+39 "学校:"+this.getSchool();40 }41 }42 public class Demo {43 public static void main(String[] args) {44 Student stu = new Student("Tom", 19, "北京大学");45 System.out.println(stu.getInfo());46 }47 }