抽象类

抽象类

抽象类概述

抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要重写的方法,这样相当于在语法上对子类进行了严格的限制,开发变得更加标准。
所谓抽象类就是在普通类中增加了抽象方法,抽象方法是没有方法体的方法,使用关键字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;

抽象类

上一篇:freebsd 编译内核


下一篇:[方法] 如何做产品功能流程和结构设计