//定义一个抽象类
abstract class A{
public void fun(){ //普通方法。。。为什么????因为有大括号啊!!!
System.out.println("存在有方法体的方法");
}
public abstract void print(); //抽象方法
//A是抽象的,无法实例化
}
public class TestDemo4 {
public static void main(String args[]){
A a=new A();
a.fun();
a.print();
}
}
·普通类可以直接产生实例化对象,可以包含构造方法、普通方法、static方法、常量、变量的内容;
·抽象类指在普通类的结构中增加抽象方法的组成部分;
所有的普通方法都有一个“{}”,表示的是方法体。有方法体的方法一定可以被对象直接使用,抽象方法指的是没有方法体的方法,需使用关键字abstract进行定义,拥有抽象方法的类叫做抽象类,抽象类需要用abstract声明。
!!!!!抽象类和普通类只是差一个抽象方法!!!!!!
A不能实例化原因:当一个对象进行实例化后意味着这个对象可以调用类中的属性或方法,在抽象类中有抽象方法,抽象方法没有方法体,没有方法体的方法不能调用。
抽象类的使用原则:
①抽象类必须有子类;
②抽象类的子类必须覆写抽象类之中的全部抽象方法(子类不能是抽象类);
③抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理。
//定义一个抽象类
class A{
public void fun(){ //普通方法。。。为什么????因为有大括号啊!!!
System.out.println("存在有方法体的方法");
}
public abstract void print(); //抽象方法
//A是抽象的,无法实例化
}
class B extends A{ //一个子类只能继承一个抽象类,属于单继承局限
public void print (){
System.out.println("Hello World!");
}
}
//正确使用抽象类
public class TestDemo4 {
public static void main(String args[]){
A a=new B(); //B类的向上转型
a.fun();
a.print(); //这里调用的是被子类所覆写过的方法
}
}
·抽象类的继承方法中会有明确的方法覆写要求,而普通类没有;
·抽象类只比普通类多了一些抽象方法的定义,其他部分与普通类一致;
·抽象类对象不可直接进行实例化,必须经过向上转型才可得到实例化对象。
*****如果需要规定子类强制做某事,就需要用抽象类,普通类不要去继承另外一个普通类,一般只继承抽象类*****
抽象类的限制
①抽象类可以有构造方法,因为抽象类中会存在一些属性,所以一定会存在构造方法,目的就是为属性初始化 ;
②抽象类不可以用final声明,因为抽象类必须有子类,而final定义的类不能有子类;
③外部的抽象类不允许使用static声明,内部的抽象类允许使用static声明,
使用static声明的内部抽象类相当于一个外部抽象类,继承时应该使用“
外部类.内部类”的形式表示类名称;
④任何情况下,如果要执行类中的static方法,都可以在没有对象(可以不实例化)的时候直接调用,对于抽象类也是一样;
⑤由于抽象类只需要一个特定的系统的子类操作,所以可以忽略外部的子类 。
**************构造方法是整个构造过程的最后一步,所有属性的设置内容都是在构造完成之后才开始被设置,任何一个类的构造执行完之前,所有属性的内容都是其对应数据类型的默认值,而子类对构造执行之前一定先执行父类构造,此时子类构造还没有执行。************
总结:
1、如果真的要使用类继承的话,就使用抽象类(20%的情况下可能这样使用);
2、抽象类强制规定了子类必须做的事情,而且可以与抽象类的普通方法相配合;
3、抽象类有一个最大的问题,单继承极限。
转载请注明原文地址: https://ju.6miu.com/read-1125090.html