1.java抽象类的基本概念
普通类就是完善的功能类,直接生产对象并使用,其中的方法都已经实现完整(带有方法体"{}").抽象类的最大特点包含了抽象方法,抽象方法是只声明(没有方法体)的方法,抽象方法定义时使用abstract关键字完成,并且抽象方法一定要在抽象类中,抽象类要使用abstract关键字声明.
2.下面程序可以了解到,由于类中存在了一个抽象方法get(),所以A类就必须使用abstract定义为抽象类,但是抽象类毕竟不是完整的类,所以不能像以前那样,直接实例化对象.
abstract class A{
private String in = "芷若 张无忌";
public void print(){
System.out.print(in);
}
public abstract void get(); //抽象方法:只有声明没有方法体
}
错误使用----直接实例化
一个类对象实例化后,可以调用类中的属性和方法,但是抽象类中的抽象方法没有方法体,所以这样肯定不合理.
public class Test{
public static void main(String args[]){
A a =new A() //错误:Cannot instantiiate the type A
}
}
在实际开发中,抽象类使用原则如下.
1.抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
2.子类(如果不是抽象类)必须覆写抽象中的全部抽象方法;
3.抽象类对象可以使用对象的向上转型,通过子类来进行实例化操作.
3.使用抽象类
与之前类的继承不一样的是,抽象类定义出子类必须要覆写的方法,而之前的类可以选择性地决定是否需要覆写,并且,抽象类实际上就比普通类多了一些抽象方法而已,其他定义和普通类一样.
运行结果
结论:
1.抽象类不能使用final定义,final定义的类不能有子类.
2.抽象方法可以有构造方法,抽象类除了包含抽象方法外,还包含了普通方法和属性,而属性一定要在构造方法执行完毕后才可以进行初始化操作.
3.抽象类可以没有抽象方法,但是如果有抽象方法,则一定是抽象类,即使抽象类没有抽象方法,也不能够被直接实例化.
4.抽象类使用static有两种情况:
情况一:直接使用static,肯定无法定义一个抽象类
情况二:在内部类定义可以直接使用static,就表示定义了一个内部抽象类.
4.定义内部抽象类
定义抽象内部类,同时使用static声明,这就表示一个外部类,即抽象类的名称为"A.B".
运行结果
5.看下面程序
运行结果
输出结果为"0",要解释这个结果,参考之前讲过构造方法给出的问题:“一个类只有执行了构造方法后,才可以为类中的属性初始化,而在属性没有初始化前,类中所有的属性都是对应数据类型的默认值”.
主类实例化的是子类对象,根据对象的实例化流程,子类对象实例化前首先调用父类构造,为父类中的属性初始化,这时候子类对象由于没有被实例化,所以Po2类中的x属性就是其对应数据类型的默认值0,在父类构造中,又调用了print()方法,而此时实例化的是子类对象,所以调用的肯定是被覆写过得方法,所以结果为"x=0".