抽象类
抽象类概述
抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要重写的方法,这样相当于在语法上对子类进行了严格的限制,开发变得更加标准。
所谓抽象类就是在普通类中增加了抽象方法,抽象方法是没有方法体的方法,使用关键字abstract定义。包含抽象方法的类是抽象类,也要用abstract声明。
abstract class A{ //使用abstract声明定义了一个抽象类
public void fun(){ //普通方法
}
public abstract void print();//使用abstract定义的抽象方法,没有方法体
}
抽象类使用特点
因为抽象类中的抽象方法没有方法体,所以无法通过抽象类来实例化对象。
如果要使用抽象类,必须遵守以下原则:
- 抽象类必须要有子类,同时抽象类也要服从单继承的限制。
- 抽象类的子类必须覆写抽象类的全部抽象方法。
- 依靠对象的向上转型,可以通过抽象类的子类完成抽象类的实例化对象操作。
abstract class A{
public abstract void print();
}
class B extends A{
public void print(){ //覆写抽象类的抽象方法
System.out.println("Hello World!");
}
}
public class Demo{
public static void main(String[] args){
A a = new B(); //向上转型
a.print(); //被子类覆写过的方法
}
}
虽然一个子类可以去继承任何的普通类,但是从实际的开发要求来看,普通类最好去继承抽象类。
抽象类除了抽象方法外还可以拥有普通方法和属性,所以在使用时会有一些限制:
- 抽象类中由于会存在一些属性,那么在抽象类中一定会存在构造器,目的是为属性初始化,并且子类对象实例化时也会先调用父类的构造器。
- 抽象类不能使用final定义,因为抽象类必须有子类,而final不能有子类。
- 抽象类可以没有任何抽象方法,但只要是抽象类就不能用new关键字实例化。
abstract class A{ //定义一个抽象类
public void print(){ //只有一个普通方法
System.out.println("Hello World!");
}
}
class X extends A{
}
public class Demo{
public static void main(String[] args){
A a = new X(); //向上转型
a.print();
}
}
//执行结果:Hello World!
在任何一个类构造执行完成之前,所有属性的内容都是其对应数据类型的默认值。
//程序流程用数字标出
abstract class A{ //定义抽象类
public A(){ //2.先调用父类的构造器
this.print();//3.父类的构造器会调用子类覆写的方法
}
public abstract void print();
}
class B extends A{
private int num = 100; //子类属性的默认值,无用
public B(int num){ //5.接着调用子类的构造器
this.num = num; //6.通过构造器设置内容
}
public void print(){ //4.输出系统对整形默认值:0
System.out.println("num = "+num);
}
}
public class Demo{
public static void main(String[] args){
A a = new B(30); //1.实例化对象
a.print();
}
}
//程序执行结果为:
//num = 0;
//num = 30;