抽象类
普通类可以直接产生实例化对象,并且在普通类中可以包含有构造方法,普通方法,static方法,常量,变量等,而所谓的抽象类就是在普通类里面增加抽象方法;普通的方法含有{}(方法体),可以由对象直接调用方法执行方法体,而抽象方法没有{},其只声明方法而实现该方法由子类实现;
一,抽象类基本使用
抽象类使用abstract声明,同时抽象方法也需要abstract声明;
abstract class A{//定义抽象类
public void print(){//定义普通方法
System.out.println("-----------");
}
public abstract void fun();//定义抽象方法
}
class TestJava{
public static void main(String args[]){
A a = new A();
}
}
结果:TestJava.java:9: 错误: A是抽象的; 无法实例化;
在类的实例化之后,对象就可以调用类拥有的属性和方法,而抽象类的抽象方法只声明并没有实现所以实例化不能进行;
二,抽象类的使用原则
1,抽象类必须有子类,才有意义;
2,抽象类的子类(子类不是抽象类)必须覆写抽象类中所有抽象方法(强制子类覆写);
3,抽象类的实例化必须通过子类来完成,通过向上转型的方式处理;
注:一个子类只能继承一个抽象类,属于单继承局限;
三,抽象类的相关限制
1,由于抽象类中会存在一些属性,所以抽象类中也含有抽象方法,且也符合子类对象初始化时先调用父类的构造方法,再调用子类构造方法的情况;
2,抽象类不能使用final声明,因为抽象类必须有子类才能实例化;
final abstract class A{//定义抽象类
}
class B extends A{
}
class TestJava{
public static void main(String args[]){
}
}
结果:TestJava.java:1: 错误: 非法的修饰符组合: abstract和finalfinal abstract class A{//定义抽象类
3,外部的抽象类不允许static声明,而内部的抽象类允许static声明;
abstract class A{//定义抽象类
static abstract class B{//static 声明的内部抽象类
public abstract void fun();//定义抽象方法
}
}
class C extends A.B{
public void fun(){
System.out.println("---------------");
}
}
class TestJava{
public static void main(String args[]){
C c = new C();
c.fun();
}
}
结果:“------------------”;
4,如果要调用static声明的方法的时候,可以使用类调用,抽象类也一样;
abstract class A{//定义抽象类
public static void fun(){
System.out.println("true");
}
}
class TestJava{
public static void main(String args[]){
A.fun();
}
}
结果:true;
5,使用static可以隐藏子类在抽象类中
abstract class A{//定义抽象类
public abstract void fun(); //定义抽象方法
private static class B extends A{//继承子类私有不可见
public void fun(){//实现抽象方法
System.out.println("true");
}
}
public static A getInstance(){
return new B();
}
}
class TestJava{
public static void main(String args[]){
A.getInstance().fun();
}
}
结果:true;通过调用抽象类的getInstance静态方法获取子类实例向上转型获得A对象;
总结:
1,抽象类继承子类里面会有明确的方法覆写要求,普通类没有;
2,抽象类比普通类只多了抽象方法的定义,其他的没区别;
3,普通类对象可以直接实例化,而抽象类的对象必须由子类向上转型才能实例化
注:从开发要求来讲,普通类最好不要去继承其他普通类,只能继承抽象类;