包含一个或多个抽象方法的类本身必须被声明为抽象的。
除了抽象方法之外,抽象类还可以包含具体数据和具体方法。
类即使不含抽象方法,也可以将类声明为抽象类。
抽象类不能被实例化。
可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。
例:
Person.java
package cn.java.study.grammar;
public abstract class Person {
public abstract String getDescription();
}
Student.java
package cn.java.study.grammar;
public class Student extends Person{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return "name:" + name + " age:" + age;
}
public static void main(String[] args){
Person person = new Student("Luccy", 10);
person.getDescription();
System.out.println("description:" + person.getDescription());
}
}
Person p = new Student("name", 10);
这里的p是一个抽象类Person的变量,Person引用类一个非抽象子类Student的实例。
p.getDescription()
由于不能构造抽象类Person的对象,所以变量p永远不会引用Person对象,而是引用Student这样具体子类对象。
是否可以省了Person超类中的抽象方法,而仅在Student子类中定义getDescription方法呢?
如果这样的话,就不能通过变量p调用getDescription方法类。编译器只允许调用在类中声明的方法。