Java基础知识——继承之抽象类

1、抽象类介绍

如果有多层继承的话,位于上层的类更具有通用性,可能更加抽象。一般来说,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为想使用的特定的实例类。

通常将更通用的属性和方法放在较高层次的通用超类中。

比如,超类Person,两个子类Employee和Student,两个子类都有姓名属性,可以将getName方法放在超类Person中。现在再增加一个getDescription方法,用来对一个人进行简短的描述,如

an employee with a salary of $5000

a student majoring in computer science

 在两个子类中实现这个方法很容易,但是Person类除了姓名之外一无所知,虽然可以让Person.getDescription()返回空字符串,但是更好的做法是使用 abstract关键字,使其变成抽象方法,这样在超类Person中就不用实现这个方法了。

包含一个或多个抽象方法的类本身也要声明为抽象的

public abstract class Person{
    ......
    public abstract String getDescription();
    // 不需要具体实现
    ......
}

抽象类除了抽象方法外,也可以包含具体的数据和具体方法。

2、扩展抽象类

抽象方法充当占位的角色,它们的具体实现在子类中。

扩展抽象类有两种选择,第一种是在抽象类中只定义部分抽象方法甚至不定义抽象方法,这样的话就必须将子类也标记为抽象类;第二种是在抽象类中定义全部的抽象方法,这样子类就不用定义为抽象类了。

比如,Person类定义为抽象类,并将getDescription方法定义为抽象方法,子类Student实现getDescription()方法,由于Student类不包含抽象方法,因此Student类不必声明为抽象类。

当然,不包含抽象方法的类也可以被声明为抽象类,但是抽象类不能被实例化,但可以创建一个具体子类的对象;可以定义一个抽象类的对象变量,但它只能引用非抽象子类的对象。

new Person(...);
// 错误,因为抽象类不能被实例化

new Student(...);
// 可以,子类不是抽象类

Person p = new Student(...);
// 可以,可以定义抽象类Person的对象变量p,引用非抽象子类Student的对象实例

你可能感兴趣的:(Java语法基础学习,java,开发语言)