在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法、初始化块和构造方法和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
在Java语言中使用abstract class来定义抽象类。
//抽象类:普通类有的一切,抽象类都有,抽象类比普通类多了抽象方法,且不能被实例化
public abstract class Test{
// 构造器
public Test () {
System.out.println("Test的無參构造器");
}
// 定义一个普通方法
public void sleep() {
System.out.println("普通方法");
}
// 抽象方法只包含一个方法名,没有方法体,必须使用abstract修饰符来修饰
public abstract void running();
public abstract String say(String str);
}
如果一个类包含抽象方法,那么该类必须是抽象类。
任何子类必须重写父类的抽象方法,或者声明自身为抽象类。继承抽象方法的子类必须重载该方法,否则该子类也必须声明为抽象类。
最终,必须有子类实现该抽象方法,否则从最初的父类到最终的子类都不能用来实例化对象。
//继承了一个抽象类,必须实现父类中的所有抽象方法,如果父类也继承了一个抽象类,那么父类继承的那个抽象类的所有的抽象方法也得在这里实现
public class Demo extends Test {
@Override
public void running() {
System.out.println("第一个抽象方法");
}
@Override
public String say(String str) {
return "谁说:“"+str + "”";
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.sleep();
demo.running();
System.out.println(demo.say("谁?")); }
}
运行结果如下:
总结:
1. 抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。
2. 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。
3. 抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)五种成分。
4. 抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
6. abstract 和static不能同时修饰一个方法。