抽象类概述

抽象类关键字abstractabstract即可以修饰方法,也可以修饰类,凡是被abstract修饰的方法和类分别就是抽象方法、抽象类。

1. 抽象类语法格式:

public abstract class 类名 {}
  • A、 抽象类必须被继承:

    抽象类必须让子类来继承并重写父类的抽象方法(其他方法不作要求),不重写会直接报错。

    示例:

    //Action.java //定义抽象类 
    package com.zctou.oop.demo10;
    
    public abstract class Action {
        public void say(){}
        public abstract void doSomthing();
    }
    
    //Subaction.java //子类继承抽象类
    package com.zctou.oop.demo10;
    
    public class SubAction extends Action{ //不重父类抽象方法会报错
    }
    
    可以看到,子类不重写抽象类的方法,直接报错

    认识Java中的抽象类

  • B、抽象类不能直接被实例化。

    抽象类不能用new关键字生成对象,只能作为其他类的超类(父类),这与final类(断子绝孙类)正好相反。

    //Application.java 测试类 
    package com.zctou.oop;
    
    import com.zctou.oop.demo10.Action;
    
    public class Application {
        public static void main(String[] args) {
            new Action(); //直接实例化抽象类对象会报错:提示'Action' is abstract; cannot be instantiated
        }
    }
    
    //'Action' is abstract; cannot be instantiated

2. 抽象方法的语法格式:

public abstract void doSomthing();
从语法格式可以看到,抽象方法没有方法体,不能有{}。同时必须注意要有;,因为是个声明。
  • A、抽象方法,只有方法的声明,不能有方法的实现。

    认识Java中的抽象类

  • B、抽象方法必须交由子类来重写这些方法的实现细节。
  • C、定义了抽象方法的类一定要声明为抽象类。不声明为抽象类的错误提示为:"Abstract method in non-abstract class"。

    认识Java中的抽象类

  • C、抽象类可以没有抽象方法,也可以有其他普通方法。

    认识Java中的抽象类

子类继承了抽象类,就必须要实现抽象类没有实现的抽象方法,否则子类也要声明为抽象类。

思考:

1. 抽象类不能实例化,那抽象类有构造器吗?

答:抽象类虽然不可以直接用new实例化对象,但可通过子类实例化。而子类默认是调用父类的无参构造的(super()),所以抽象类是可以有构造器的。

示例:还是上面的三个文件

//Action.java 
package com.zctou.oop.demo10;

public abstract class Action {
    public Action() {
        System.out.println("抽象类无参构造执行了");
    }
    public void say(){}
    public abstract void doSomthing();

}

//Application.java
package com.zctou.oop;

import com.zctou.oop.demo10.Action;
import com.zctou.oop.demo10.SubAction;

public class Application {
    public static void main(String[] args) {
        Action action = new SubAction(); //抽象类作引用变量
        action.doSomthing(); //调用抽象类自身的方法,抽象方法是调用被子类重写过的方法
    }
}

//输出
抽象类无参构造执行了
子类实现抽象方法doSomthing()

2. 抽象类的意义:

抽象类可以将设计和实现分离,你写你的抽象类,我写我的实现方法。这也是为什么说抽象方法必须被继承才有意义!抽象类的出现就是为了提供约束标准,更利于代码的维护和重用。

文章目录