抽象类
抽象类不能实例化(创建实例对象),只能靠子类实现其中的方法。
抽象类中可以包含字段和普通(具体)方法,但抽象方法必须属于抽象类
public abstract class Person {
private String name;//抽象类中可以包含字段
public Person(String name){
this.name = name;
}
//抽象方法,只有方法名,没有方法体。必须属于抽象类。
public abstract String getDescription();
//抽象类中可以包含具体方法
public String getName() {
return name;
}
}
public class Student extends Person {
private String major;
public Student(String name,String major) {
super(name);
this.major = major;
}
@Override //实现父类抽象方法
public String getDescription() {
return super.getName()+" major in "+major;
}
}
可以定义一个抽象类的对象变量,但是这样一个变量只能引用非抽象子类的对象。
Person p = new Student("xiaoming","Economics");
将子类对象填充到父类引用数组
public abstract class Person {
private String name;
public Person(String name){
this.name = name;
}
public abstract String getDescription();
public String getName() {
return name;
}
}
public class Student extends Person {
private String major;
public Student(String name,String major) {
super(name);
this.major = major;
}
@Override
public String getDescription() {
return super.getName()+" major in "+this.major;
}
}
public class Employee extends Person{
private int salary;
public Employee(String name,int salary) {
super(name);
this.salary = salary;
}
@Override
public String getDescription() {
return super.getName()+" with a salary of "+this.salary;
}
}
public class Application {
public static void main(String[] args) {
Person[] people = new Person[2];
people[0] = new Student("xiaoming","economics");
people[1] = new Employee("daming",5000);
for(Person p:people){
System.out.println(p.getDescription());
}
}
}
如果仅在子类中定义getDescription方法,就不能在变量p上调用getDescription方法。编译器只允许调用在类中声明的方法。