一:概述
要说抽象类先来说说抽象方法,抽象方法指没有方法体的方法,同时需要用abstract修饰。而拥有抽象方法的类就是抽象类,也需要abstract来修饰。
二:使用与注意
抽象类的使用原则如下:
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
(2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理。
(3)抽象类不一定必须有子类,使用extends继承,一个子类只能继承一个抽象类。 常量类做成抽象类,防止实例化。但是如果抽象类有抽象方法一定必须有子类(因为抽象类的轴向方法必须被子类全部重写)
(4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。)
抽象类直接实例化:
A a=new A();
a.tell1();
通过子类实例化:
abstract class A{
public void tell1(){
System.out.println("A--tell1");
}
}
class B extends A{
public void tell1(){
System.out.println("B--tell1");
}
}
public class dogi {
public static void main(String[] args) {
//向上转型
A a=new B();
a.tell1();
}
}
输出:
我们看到这里可以间接的实例化,通过父类的引用指向子类的对象,子类进行实例化之前需要实例化它的父类,java三大特征之一的多态。
请注意一下
//向上转型
A a=new B();
a.tell1();
//向上转型
A a=new A();
B b=new B();
a=b;
虽然这里两个向上转型意思一样,但是在抽象类通过子类实例化时,只能使用第一种匿名对象方法一部一步实例化第二种会报错。
5):由于抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。 并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。(使用向上转型实例化)
6):抽象类可以用final声明么?
不能,因为抽象类必须有子类,而final定义的类不能有子类;
7):外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。
/
/
/
希望看到我文章朋友,如果发现有什么不足之处,能够不吝赐教,多多指点,我一定洗耳恭听。