java编程思想-abstract class与interface

Abstract class

虽然接口的抽象层次更高一点,但是毕竟不可能你使用的全部都是interface吧,还是会碰到一些abstract class的。

abstract class就是一个类中有一个或者多个abstract method的情况,而abstract method就是没有实现只有声明的方法,留待子类去实现(子类必须实现)。
类似这样的:
public abstract class Instrument {

	public Instrument() {
		// TODO Auto-generated constructor stub
	}
	public abstract void play();
	public String what() { return "Instrument"; }
	public abstract void adjust();
}
其实可以这样理解:abstract class设计的目的就是提供一个统一的接口,你在使用的时候可以根据不同的子类以不同的方式(override method)表达出来,而这些subtype又继承于它从而他们用用共同的一些特性。
abstract class的对象是没有意义的,它只是一个抽象而已,真正具有意义的是它的子类。因此我们需要避免程序猿不小心new出一个abstrac object来。怎么办呢?可以让超类的所有的方法默认报错,但是这样只有在run-time使用这些方法的时候才会generate error;另一种方法就是,使用abstract method, 即如果这个类中含有abstract method的话,编译器会在compile-time的时候就阻止你new出abstract object,而拥有abstract method的类必须也声明为abstract才可以,即abstract class。

public class Wind extends Instrument {

	public Wind() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void play() {
		System.out.println("wind.play().");
	}

	@Override
	public void adjust() {
		// TODO Auto-generated method stub
	}
	
	@Override
	public String what(){ return "Wind"; }

}
子类必须实现超类的方法,即specified。这样子类的实例就具有了自己特殊的意义了,而超类只是一个接口。就像你用Instrucment表达所有的乐器,但是这个含义太广泛了,而Wind就特指一种乐器了,它有自己发弹奏的方法了。
如果你想new一个abstrac object呢?编译器会给你一种选择,就是“当场"实现其中的abstract method,像下面这样,这样的嵌套可能会让你不是很舒服,不过它确实是对的:
Instrument i = new Instrument() {
			
			@Override
			public void play() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void adjust() {
				// TODO Auto-generated method stub
				
			}
		};

。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值