探索Java interface和abstract类的秘密

欢迎转载但请标明出处:http://blog.csdn.net/android_for_james/article/details/51104785      

      我们先来想清楚这件个例子:

      飞机和鸟是不同的两类事物,但它们的共同的功能就是都会飞,我们可以创建两个类,一个是class Airplane{},一个是class Bird{},但是我们不可以将Fly也创建为一个类,因为它是一种功能(方法)所以我们只能把它抽象成一种接口,Airplane类和Bird根据飞行功能的差别来分别实现自己的Fly接口。如果飞机的类型不同则直接继承Airplane这个类就好,不同种类的鸟也是一样。

      这样我们就直观的看出类是一种体现共性的一个分类,是一类事物就有和父类相同之处我们只需要继承父类就好,而接口是一种体现一个类具不具有某个功能,如果具有我们就去实现这个接口,否则就不实现。

      接下来我们先来看abstract类,它既然叫~类我们就可以认为它就属于java类的一个分支,因此它的作用就是用来被继承,与普通方法相比,它内部可以有普通方法和abstract方法,而对于abstract方法只可以声明不可以写实现,通过这个特性我们可以想到这个方法可以让我们只关心操作,而细节的实现交给继承它的非abstract子类去实现

这时就可以看出我们可以面向抽象编程,比如我们声明一个计算柱体的底面积为一个abstract类,我们在计算底面积时需要考虑柱体的底面是矩形,三角形,圆形还是其他,这时我们只需要在abstract类中声明一个叫getArea()的abstract方法即可,具体的计算交给具体的不同形状的类去继承并实现,我们来看具体代码:

abstract class Geometry
{
	
	//所有继承abstract类的类均都必须要重写里面的abstract方法!
	public abstract double getArea();
}
 class Circle extends Geometry
{
	double r;
	Circle(double r)
	{
		this.r=r;
	}
	public  double getArea()
	{
		return (3.14*r*r);
	}
}
class Rectangle extends Geometry
{
	double a,b;
	Rectangle(double a,double b)
	{
		this.a=a;
		this.b=b;
	}
	public double getArea()
	{
		return a*b;
	}
}
注意:

1.abstract类不能用new创建对象

2.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public

3.如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

      接下来我们再来看interface,接口泛指供别人调用的方法或者函数,从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。接口的定义与类的定义很相似,而且它和abstract类也十分相似,接口体中的方法也是抽象方法,也就是说在接口中定义的方法也只关心操作不关心实现,因此在一个类中想要实现接口必须重写它的所有抽象方法,一个类可以拥有多个接口分别用逗号间隔。接口其实是一种规范,我们可以这样理解这种规范就是生产电脑的厂商很多,但电脑需要有一个开机功能,为达到这个功能所有的厂商都需要实现同一个接口就是能开机就行,我们不需要管开机键的位置在哪或者开机的方式是怎样的。比如狗和猫都会叫,因此叫就是一个接口,而猫叫和狗叫的声音并不同我们只需要单独重写各自的叫声就好,下面我们来看代码:

interface Cry
{
	void getCry();
}
class Dog implements Cry
{
	public void getCry()
	{
		System.out.println("汪汪");
	}
}
class Cat implements Cry
{
	public void getCry()
	{
		System.out.println("喵喵");
	}
}
注意:

1.接口体中只能有抽象方法,不可以有普通方法

2.接口体中的常量访问权限是public static final(可省略)方法访问权限是public(可省略)

3.所有实现接口的类必须重写接口中的所有方法,如果没有重写则这个类必须是abstract类

下面我们再来看看interface的细节用法:

package Unit6_3;

public class Interface_test {
	//接口的实现
	public static void main(String args[])
	{
		Bus bus=new Bus();
		Taxi taxi=new Taxi();
		Cinema cinema=new Cinema();
		//带接口参数的类
		ShowAdvertisement showADs=new ShowAdvertisement();
		//接口回调:当接口声明的变量被赋予一个实现该接口的类创建的对象时,该接口变量就可以调用被类实现的接口方法
		WhichClass whichclass;
		whichclass=new Bus();
		//实际就是通知相应对象调用该方法
		whichclass.ShowClassName("公交车信息如下:");
		//如果一个方法的参数是接口类型,则我们可以将任何实现该接口的类的引用传入
		//这里会使用一个接口回调使showADs-->bus
		showADs.showAD(bus);;
		bus.Charge();
		System.out.println("");
		whichclass=new Taxi();
		whichclass.ShowClassName("出租车车信息如下:");
		showADs.showAD(taxi);
		taxi.Charge();
		taxi.ControlAirTemperature();
		System.out.println("");
		whichclass=new Cinema();
		whichclass.ShowClassName("电影院信息如下:");
		showADs.showAD(cinema);
		cinema.Charge();
		cinema.ControlAirTemperature();
		
	}

}
abstract class Vehicles
{
	//定义一个abstract类它只关心操作不关心实现,既所有交通工具都具有刹车功能
	abstract void BrakeFun();
}
interface MoneyFare
{
	//接口中的所有常量的访问权限都是public,而且是static常量
	//所有的抽象方法都是public
	//默认允许省略public abstract
	//收钱接口,在某些交通工具中可能会有收费项目但不是所有交通工具都具有,所以写成接口
	void Charge();
}
interface ControlTemperature{
	//空调接口
	void ControlAirTemperature();
}
interface WhichClass
{
	void ShowClassName(String s);
}
interface GetAD
{
	void GetADs();
}
class ShowAdvertisement
{
	//这个类充当着面向接口编程的角色
	//面向接口编程核心是接口回调
	//这个方法传入的值是一个接口
	public void showAD(GetAD getAD)
	{
		//接口回调
		getAD.GetADs();
	}
}
class Cinema implements MoneyFare,ControlTemperature,WhichClass,GetAD{

	public void GetADs()
	{
		System.out.println("体验浪漫情怀,享受视听盛宴。");
		
	}
	public void ShowClassName(String s)
	{
		
		System.out.println(s);
	}
	//所有实现借口的类均需要重写接口中的方法
	public void Charge()
	{
		System.out.println("电影票价35");
	}
	public void ControlAirTemperature()
	{
		System.out.println("内置空调,室温22度");
	}
}
class Bus extends Vehicles implements MoneyFare,WhichClass,GetAD
{
	
	void BrakeFun()
	{
		System.out.println("使用鼓式刹车");
	}
	public void GetADs()
	{
		System.out.println("文明开路,和谐进步");
	}
	public void ShowClassName(String s)
	{
		
		System.out.println(s);
		
	}
	public void Charge()
	{
		System.out.println("公交车票价一元");
	}
	
}
 class Taxi extends Vehicles implements MoneyFare,ControlTemperature,WhichClass,GetAD
{
	void BrakeFun()
	{
		System.out.println("使用ABS防抱死刹车系统");	
	}
	public void GetADs()
	{
		System.out.println("为您提供安全舒适的行程。");
	}
	public void ShowClassName(String s)
	{
		System.out.println(s);
	}
	public void Charge()
	{
		System.out.println("出租车起步价10元");
	}
	public void ControlAirTemperature()
	{
		System.out.println("内置空调,温度为21度");
	}
}

由此我们可以看出抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。

希望对大家有所帮助,欢迎转载但要标明出处,谢谢!

有什么不足的地方可以留言给我我会尽快回复并改正!

欢迎关注我的博客:http://blog.csdn.net/android_for_james





你可能感兴趣的:(java,interface,abstract类)