2020/8/29
闲来无事整理了一下《Java核心技术 卷Ⅰ》中有关抽象类的相关内容。共计六条重要知识点如下:
1、抽象类是含有一个或多个抽象方法的类,只要含有一个抽象方法,这个类就一定要声明为abstract。抽象类只是作为派生其他类的基类,而不适用于构造特定实例。
2、抽象类可以包含有字段和具体方法。
举例:Person类
public abstract class Person
{
private String name;//字段
public Person(String name)//构造函数
{
this.name = name;
}
public abstract String getDescription();//抽象方法
public String getName()//具体方法
{
return name;
}
}
3、抽象类不能实例化,即不能创建抽象类的对象。
4、如果一个子类继承于一个抽象类:
a)子类中部分父类的抽象函数仍未定义,那么子类也要声明为abstract。
b)子类定义了父类所有抽象方法,则子类不需要声明为abstract。
5、即使一个类中不含有抽象方法,仍可以将其声明为抽象类。
6、虽然抽象类不能实例化,但允许定义一个抽象类的对象变量。
Person p;//这是合法的
抽象类的对象变量只允许引用其非抽象子类的对象。
父类变量引用非抽象子类对象时可以使用父类中的抽象方法。
//定义一个非抽象的Student类,其继承于抽象类Person
public class Student extends Person
{
private String major;
public Student(String name, String major)
{
super(name);
this.major = major;
}
public String getDescription()
{
return "a student majoring in" + major;
}
}
Person p = new Student("Harry", "cs");//合法,抽象类对象引用非抽象类子类的对象。
System.out.println(p.getDescription());//合法,此时的p引用的是Student类的对象。
但请注意,如果Student类中新定义了一个goClass()方法,即使此时的p引用的是Student类对象,仍然不可以调用p.goClass()。因为编译器只允许调用在类中声明的方法。
public class Student extends Person
{
...
public void goClass()//新增一个父类中没有的方法
{
System.out.println("In class.");
}
}
Person p = new Student("Harry", "cs");
p.goClass();//不合法,因为Person类中没有声明goClass方法。