Java抽象类

如果自下而上仰视类的继承层次结构,那么位于上层的类更具有通用性,甚至可能更加抽象。从某种角度看,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为想使用的特定的实例类。

例如,考虑一下对Empoyee类层次的扩展。一名雇员是一个人,一名学生也是一个人。下面将Person和类Student添加到类的层次结构中,如下图:


为什么要花费精力进行这样高层次的抽象呢?每个人都有一些诸如姓名这样的属性。学生与雇员都有姓名属性,因此可以将getName方法放置到位于继承关系较高层次的通用超类中。

现在,再增加一个getDescription方法,它可以返回对一个人的简短描述。例如:

an employee with a salary of $50,000.00

a student majoring in computer science

在Employee类和Student类中实现这个方法很容易。但是在Person类中应该提供什么内容呢?除了姓名之外,Person一无所知。当然,可以让Person.getDescription()返回一个空字符串。然而,还有一个更好的方法,就是使用abstract关键字,这样就完全不需要实现这个方法了。

public abstract String getDescription();
//no implemention required
为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的。

abstract class Person{
    ......
    public abstract String getDescription();
}
除了抽象方法之外,抽象类还可以包含具体数据和具体方法,如:

abstract class Person{
    private String name;
    public Person(String n){
        name = n;
    }
    public abstract String getDescription();
    public String getName(){
        return name;
    }
}
此外,抽像类不能被实例化,但它可引用非抽象子类的对象。

现在来看,我们定义一个类,里面放一个抽象方法,是为了其他类继承这个抽象类,勿必实现此抽象方法,如getDescription,Student和Employee都有描述自己的方法getDescription,但描述内容肯定是不一样的。

有些个接口要实现的方法太多,而我们只需要其中一、两个就行了,这时用抽象类就是一个很好的方法:

public static abstract class AbsMKSearchListener implements MKSearchListener {

		@Override
		public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetPoiDetailSearchResult(int arg0, int arg1) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetShareUrlResult(MKShareUrlResult arg0, int arg1, int arg2) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
			// TODO Auto-generated method stub
		}

	}
我们只想要onGetAddrResult这个回调方法,若是实现MKSearchListener,就必须实现所有接口,这样要多写很多代码且代码冗余,一两个要实现的接口也罢,但太多时,用抽象类是佳选,不过里面的方法都是已经空实现了的,故在继承抽象类AbsMKSearchListener时,实现里面任一方法都可以。


Java抽象类,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。