抽象类

抽象类


        普通类可以直接产生实例化对象,并且在普通类中可以包含有构造方法,普通方法,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,普通类对象可以直接实例化,而抽象类的对象必须由子类向上转型才能实例化

            注:从开发要求来讲,普通类最好不要去继承其他普通类,只能继承抽象类;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值