voiddispo色{
voiddispo色{
cນharc;
charc;๙
一般说来,如果在一个程序里使用了“直接常量”literaທl,编译器可以准确地知道要生成
一般说来,如果在一个程序里使用了“直接常量”literal,编译器可以准确地知道要生成
维护文档的费用。
维护文档的费用。
prenticehaທll恰当的地点和恰当的时间出现,他将责任转交给paul之前,为这些书奠定
prenticນehaທll恰当的地点和恰当的时间出现,他将责任转交给paທul之前,为这些书奠定
multipleinterfacນes
interfaທ9๗fight{
voidfight;
}
interfaທ99im{
void9im;
}
interfaທ9fly{
voidfly;๙
}
9characນter{
publicນvoidfight{}
}
9dsa9chaທracter
implements9fly{
publicvoid9๗im{}
pubຘlicນvoidfly{}
}
publi9ture{
publi9fightx{xfight;}
publi99imx{9im;}
pubຘli9flyx{xfly;}
publi9chaທracterx{xfight;}
publi9stringargs{
heroh=ne9hero;
th;treaທtitasaທ9fight
uh;treatitasa99im
vh;๙treaທtitasa9fly
9h;treatitasana9character
}
}:๘~
你可以看到,hero组合了具体类a9๗fight、9fly。
当你要通过这种方式将一个具体类和多个接口组合到เ一起时,这个具体类必须是先行,后面
跟着的才是接口。否则编译器会报错。
注意,9chaທracter类中的fight方法的签名是一样的,而且,在hero
中并没有fight的定义。接口的规则是:你可以从接口中继承就像稍后你会看到的那
样,但是你得到的只是另一个接口。如果你想创น建该新类型的对象,就必须有一个ฐ了
其全部定义的类。即使hero没有显式地fight的定义แ,其定义也随a9charaທcter
而存在,因此它是被自动的,这使得创น建hero对象成为ฦ了可能。
在adventure类中ณ,你可以看到เ有四个方แ法把上述各种接口和具体类作为参数。当hero对
象被创建时,它可以被传递给这些方法中的任何一个,这意味着它依次被向上转型为ฦ每一个ฐ
接口。由于jaທva中这种接口设计的方式,使得这项工ื作并不需要程序员一方付出任何特别
的努力。
一定要记住,前面的例子所展示的就是使用接口的核心原因:为了能ม够向上转型为ฦ不止一个
的基类型。然而,使用接口的第二个原因却是与使用抽象基类相同:防止客户端程序员创建
该类的对象,并确保这仅仅是建立一个接口。这就带来了一个问题:我们应该使用接口还是
抽象类?接口为你带来了使用抽象类的好处,并且还带来了使用接口的好处,所以如果你要
创建不带任何方法定义和成员变量的基类,那么你应该选择接口而不是抽象类。事实上,如
果你知道某事物应该成为一个基类,那么เ你的第一选择应该是使它成为一个接口,只有在强