普通类可以直接产生实例化对象,并且在普通类中可以包含有构造方法,普通方法,变量,常量,static方法等内容。
而所谓的抽象类就是指在普通类的结构里面增加抽象方法的组成部分。 所有的普通方法里面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用,而抽象方法指的是没有方法体的方法,且抽象方法必须使用abstract关键字定义。拥有抽象方法的类一定属于抽象类,抽象类要使用abstract声明。
1.抽象类必须有子类,即每一个抽象类一定要被子类所继承。
2.抽象类的子类(子类不是抽象类)必须要覆写抽象类之中的全部抽象方法(强制子类覆写)。
3.抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理。
4.抽象类继承子类里面会有明确的方法覆写要求而普通类并没有
5.抽象类只比普通类多了一些抽象方法的定义,其他的组成部分与普通类完全一样。
6.普通类对象可以直接实例化,但是抽象类的对象必须经过向上转型后才可以得到实例化对象
抽象类的相关限制
1.抽象类里面由于会存在一些属性,那么在抽象类之中一定会存在构造方法,目的是为属性初始化。并且子类对象实例化的时候依然满足于先执行父类构造,再调用子类构造的情况。
2.抽象类不能够使用final定义。因为抽象类必须有子类,而final定义的类不能有子类。
3.外部抽象类不允许使用static声明,而内部的抽象类允许使用static声明。使用static声明的内部抽象类就相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。
abstract class A{
//static定义的内部类属于外部类
static abstract class B{
public abstract void print();
}
}
class X extends A.B{
public void print() {
System.out.println("0000000000000");
}
}
public class TestDemo {
public static void main(String[] args) {
A.B ab=new X(); //向上转型
ab.print();
}
}
4.任何情况下,如果要执行类中的static方法的时候,都可以在没有对象的时候直接调用,对于抽象类也是一样。
abstract class A{
public static void print() {
System.out.println("Hello World!");
}
}
public class TestDemo {
public static void main(String[] args) {
A.print();
}
}
5.在任何一个类的构造完成之前,所有属性的内容都是其对应数据类型的默认值,而子类构造执行之前一定先执行父类构造,那么此时子类构造由于没有执行那么其属性内容就为默认值。