抽象类概述
抽象类关键字abstract
,abstract
即可以修饰方法,也可以修饰类,凡是被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{ //不重父类抽象方法会报错 }
可以看到,子类不重写抽象类的方法,直接报错
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、抽象方法,只有方法的声明,不能有方法的实现。
- B、抽象方法必须交由子类来重写这些方法的实现细节。
- C、定义了抽象方法的类一定要声明为抽象类。不声明为抽象类的错误提示为:"Abstract method in non-abstract class"。
- C、抽象类可以没有抽象方法,也可以有其他普通方法。
子类继承了抽象类,就必须要实现抽象类没有实现的抽象方法,否则子类也要声明为抽象类。
思考:
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. 抽象类的意义:
抽象类可以将设计和实现分离,你写你的抽象类,我写我的实现方法。这也是为什么说抽象方法必须被继承才有意义!抽象类的出现就是为了提供约束标准,更利于代码的维护和重用。