抽象类
定义:
所谓抽象类就是指在普通类的结构里面增加抽象方法的组成部分,抽象方法指的是没有方法体的方法,同时抽象方法还必须使用abstract关键字进行定义。拥有抽象方法的类一定属于抽象类,抽象类要使用abstract声明。
关于抽象方法与普通方法:
1.所有的普通方法上面都有一个"{}",来表示方法体,有方法体的方法一定可以被对象直接调用;
2.抽象类中的抽象方法没有方法体,声明时不需要加"{}",但是必须有abstract声明,否则在编译时将出现语法错误。
例:定义抽象类
abstract class A{
public void fun(){
System.out.println("存在方法体的方法");
}
//此方法并没有方法体的声明,并且存在abstract关键字,表示抽象方法
public abstract void print();
}
注意:抽象类不能直接实例化对象。
抽象类的使用原则:
1.抽象类必须有子类,即每一个抽象类一定要被子类所继承,但是在Java中每一个子类只能够继承一个抽象类,所以具备单继承局限;
2.抽象类的子类(子类不是抽象类)必须覆写抽象类中的全部抽象方法(强制子类覆写);
3.依靠对象的向上转型概念,可以通过抽象类的子类完成抽象类的实例化对象操作。
例:正确使用抽象类
abstract class A7{ //定义一个抽象类
public void fun(){ //普通方法
System.out.println("存在方法体的方法");
}
//抽象方法
public abstract void print();
}
//一个子类只能继承一个抽象类,属于单继承局限
class B7 extends A7{
public void print(){ //抽象类的子类,而且是一个普通类
System.out.println("666"); //强制要求覆写的方法
}
}
public class Test1_1_4_1 {
public static void main(String args[]){
A7 a=new B7(); //向上转型
a.print(); //被子类覆写过的方法
a.fun();
}
}
//结果
//666
//存在方法体的方法
抽象类的相关限制
1.抽象类里面由于会存在一些属性,那么在抽象类中一定会存在构造方法,目的是为属性初始化,并且子类对象实例化时依然满足先执行父类构造再调用子类构造的情况;
2.抽象类不能使用final定义,因为抽象类必须有子类,而final定义的类不能有子类;
3.抽象类中可以没有任何抽象方法,但是只要是抽象类,就不能直接使用关键字new实例化对象;
4.抽象类中依然可以定义内部抽象类,而实现的子类也可以根据需要选择是否定义内部类来继承抽象内部类。
例:定义抽象类内部的内部类
abstract class A8{ //定义一个抽象类
abstract class B8{ //定义内部抽象类
public abstract void print();
}
}
class X extends A8{ //继承static内部抽象类
public void print(){
System.out.println("666");
}
class Y extends B8{ //定义内部抽象类的子类,此类不是必须覆写
public void print(){ //方法覆写
}
}
}
5.外部抽象类不允许使用static声明,而外部的抽象类允许使用static声明,使用static声明的内部抽象类就相当于是一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。
例:利用static定义的内部抽象类为外部抽象类
abstract class A8{ //定义一个抽象类
static abstract class B8{ //static定义的内部类属于外部类
public abstract void print();
}
}
class X extends A8.B8{
public void print(){ //继承static内部抽象类
System.out.println("666");
}
}
public class Test1_1_4_2 {
public static void main(String args[]){
A8.B8 ab=new X(); //向上转型
ab.print();
}
}
//结果
//666
6.在抽象类中,如果定义了static属性或方法时,就可以在没有对象的时候直接调用。
例:在抽象类中定义static方法
abstract class A8{ //定义一个抽象类
public static void print(){ //static方法
System.out.println("666");
}
}
public class Test1_1_4_2 {
public static void main(String args[]){
A8.print(); //直接调用static方法
}
}
//结果
//666
抽象类应用——模板设计模式
例:在抽象类的普通方法中调用抽象方法
abstract class A8{ //定义一个抽象类
public void fun(){ //此为普通方法
this.print(); //在普通方法中直接调用抽象方法
}
public abstract void print(); //此为抽象方法
}
class X extends A8{ //抽象类必须有子类
public void print(){
System.out.println("666");
}
}
public class Test1_1_4_2 {
public static void main(String args[]){
A8 a=new X(); //通过子类实例化抽象化对象
a.fun(); //抽象类中的普通方法
}
}