Java抽象类的概念和使用

    |     2015年4月1日   |   Java面向对象高级特性   |     0 条评论   |    1539

自上而下的继承层次里,越靠上的类越通用,甚至更抽象。祖先类往往只包含最基本的成员,人们只把它当作派生其他类的基类,而不会拿它来 new 对象。方法也可以只给出定义、不写实现,交给子类按具体需求去完成。

这种只有定义、没有方法体(没有 {})的方法叫做抽象方法。含有一个或多个抽象方法的类必须声明为抽象类,用 abstract 修饰。

说法 对不对
包含抽象方法的类一定是抽象类 对,否则编译失败
抽象类一定包含抽象方法 错,可以一个抽象方法都没有,只为了禁止 new
抽象类不能有构造方法 错,可以有普通构造,供子类 super();不能是 abstract 构造
抽象类不能被实例化 对,但可以声明抽象类型的变量指向子类实例

一、抽象类里可以有具体成员

抽象类除了抽象方法,还可以包含实例变量和已经实现好的方法。即使没有任何抽象方法,也可以声明为抽象类,专门防止被实例化。抽象方法必须在具体子类中实现(子类若仍不实现,自己也得继续抽象)。

import static java.lang.System.*;
public class Demo {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.setName("王明");
        t.work();
        Driver d = new Driver();
        d.setName("小陈");
        d.work();
    }
}
abstract class People {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public abstract void work();
}
class Teacher extends People {
    public void work() {
        out.println("我的名字叫" + this.getName() + ",我正在讲课,请大家不要东张西望...");
    }
}
class Driver extends People {
    public void work() {
        out.println("我的名字叫" + this.getName() + ",我正在开车,不能接听电话...");
    }
}

运行结果:我的名字叫王明,我正在讲课……;我的名字叫小陈,我正在开车……。name 和 getter/setter 是公共实现,work() 留给各职业自己填。

二、怎么使用抽象类

抽象类不能直接 new People(),必须用子类去实现,再用子类实例。但可以声明类型为抽象类的变量,让它指向具体子类,也就是把抽象类当形参、实现类当实参——这是多态。

不能有抽象构造方法,也不能有抽象静态方法。构造方法可以有,只是用来给子类初始化父类那部分状态。

三、什么时候类必须是抽象的

  • 类里有一个或多个抽象方法。
  • 它是抽象类的子类,却没有把父类抽象方法全部实现完。
  • 它实现了某个接口,却没有把接口里的抽象方法全部实现完。

这些情况下类必须是抽象类;反过来,抽象类不必出现这些情况——它可以是一个方法全都实现好的类,只是不允许直接实例化。

一句话总结:抽象方法没有方法体,有它的类必须 abstract;抽象类不能 new,但可以当类型指向子类,把公共实现留在父类、差异留给子类。

转载请注明来源:Java抽象类的概念和使用
本文链接地址:https://ai.zhousir.top/?p=122
回复 取消