java接口的实现
A. java 接口怎么用应该怎么实现
java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承x0dx0a用法public class test implements 接口名称x0dx0a当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的x0dx0ax0dx0a比较抽象类与接口x0dx0a1, 抽象类与接口都位于继承树的上层x0dx0a相同点x0dx0a1, 代表系统的抽象层,当一个系统使用一颗继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,这样可以提高两个系统之间的送耦合x0dx0a2, 都不能被实例化x0dx0a3, 都包含抽象方法,这些抽象方法用于描述系统能提供哪些服务,但不提供具体的实现x0dx0a不同点:x0dx0a1, 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势限制了多继承,而接口中只能包含抽象方法.由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中添加具体方法,不会对它的子类造成影响,而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类x0dx0a2, 一个类只能继承一个直接的父类,这个父类可能是抽象类,但一个类可以实现多个接口,这是接口的优势,但这一优势是以不允许为任何方法提供实现作为代价的三, 为什么Java语言不允许多重继承呢?当子类覆盖父类的实例方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定规则,假如还允许一个类有多个直接的父类,那么会使绑定规则更加复杂,x0dx0a因此坦陪,为了简化系统结构设计和动态绑定机制,Java语言禁止多重继承.而接口中只有抽象方法,没有实例变量和静态方法,只有接口的实现类才会实现接口的抽象方法(接口中的抽象方法是通过类来实现的),因此,一个类即使有多个接口,也不会增加Java虚拟机进行动态绑定的复杂度.因为Java虚拟机永远不会把方法与接口绑定,而只会把方法与它的实现类绑定.四, 使用接口和抽象类的总体原则:x0dx0a1, 用接口作为系统与外界交互的窗口站在外界使用者(另一个系统)的角度,接口向使用者承诺系统能提供哪些服务,站在系统本身的角指枣度,接口制定系统必须实现哪些服务,接口是系统中最高层次的抽象类型.通过接口交互可以提高两个系统之间的送耦合系统A通过系统B进行交互,是指系统A访问系统B时,把引用变量声明为系统B中的接口类型,该引用变量引用系统B中接口的实现类的实例。x0dx0apublic interface B x0dx0a { x0dx0a } x0dx0a public class C implements B x0dx0a { x0dx0a } x0dx0a public class A x0dx0a { x0dx0a } x0dx0a B a = new C(); x0dx0a2, Java接口本身必须非常稳定,Java接口一旦制定,就不允许随遇更加,否则对外面使用者及系统本身造成让逗蠢影响x0dx0a3, 用抽象类来定制系统中的扩展点x0dx0a抽象类来完成部分实现,还要一些功能通过它的子类来实现
B. java里实现一个接口的类必须要实现接口里的所有方法吗
一、实现接口或继承抽象类的非抽象子类必须实现接口的所有方法或抽象类的所有抽象方法。
接口中的所有方法均为抽象方法,抽象类中包含非抽象方法和抽象方法。如果一个非抽象子类实现了接口,那么该子类必须实现父接口的所有方法。如果一个非抽象子类继承了抽象类,那么该子类必须实现抽象类的所有抽象方法。
二、实现方案
(一)实现接口
1. 定义接口
/**
*接口:表示人类行为
*/
interfaceBehavor{
/**
*抽象方法:“吃饭”方法
*/
voideat();
/**
*抽象方法:“睡觉”方法
*/
voidsleep();
}
2. 定义子类,实现接口
/**
*子类:表示人类,实现“行为”接口
*/
classPersonimplementsBehavor{
/**
*姓名
*/
protectedStringname=null;
publicPerson(Stringname){
this.name=name;
}
//实现接口的抽象方法
@Override
publicvoideat(){
System.out.println(name+"正在吃饭......");
}
//实现接口的抽象方法
@Override
publicvoidsleep(){
System.out.println(name+"正在睡觉......");
}
}
3. 定义调用类,调用方法
publicclassMain{
publicstaticvoidmain(String[]args){
Personp=newPerson("张三其");
p.eat();
p.sleep();
}
}
(二)继承抽象类
1. 定义抽象类
/**
*抽象类:表示人类
*/
abstractclassPerson{
/**
*姓名
*/
protectedStringname=null;
publicPerson(Stringname){
this.name=name;
}
/**
*抽象方法:吃饭
*/
publicabstractvoideat();
/**
*抽象方法:睡觉
*/
publicabstractvoidsleep();
}
2. 定义子类,继承抽象类
/**
*子类:学生类
*/
classStudentextendsPerson{
publicStudent(Stringname){
super(name);
}
//实现抽象类的抽象方法
@Override
publicvoideat(){
System.out.println("学生"+name+"正在吃饭......");
}
//实现抽象类的抽象方法
@Override
publicvoidsleep(){
System.out.println("学生"+name+"正在吃饭......");
}
}
3. 定义调用类,调用方法
publicclassMain{
publicstaticvoidmain(String[]args){
Personp=newStudent("张三其");
p.eat();
p.sleep();
}
}
C. 濡备綍浣跨敤JAVAweb瀹炵幇鎺ュ彛瀵规帴锛
瑕佷娇鐢↗ava Web瀹炵幇鎺ュ彛瀵规帴锛屽彲浠ユ寜镦т互涓嬫ラよ繘琛屾搷浣滐细
纭瀹氭帴鍙e规帴镄勯渶姹傦细棣栧厛闇瑕佹槑纭鎺ュ彛瀵规帴镄勯渶姹傦纴鍖呮嫭鎺ュ彛镄勫姛鑳姐佽緭鍏ュ拰杈揿嚭鍙傛暟銆佽皟鐢ㄦ柟寮忕瓑銆
缂栧啓鎺ュ彛浠g爜锛氭牴鎹闇姹傜紪鍐橨ava Web鎺ュ彛浠g爜锛屽彲浠ヤ娇鐢⊿pring妗嗘灦𨱒ョ亩鍖栧紑鍙戣繃绋嬨傚湪缂栧啓鎺ュ彛浠g爜镞讹纴闇瑕佽冭槛鎺ュ彛镄勫畨鍏ㄦс佹ц兘鍜屾墿灞曟х瓑鏂归溃銆
閮ㄧ讲鎺ュ彛锛氩皢缂栧啓濂界殑鎺ュ彛浠g爜閮ㄧ讲鍒痒eb链嶅姟鍣ㄤ腑锛屽彲浠ヤ娇鐢═omcat銆丣etty绛夊紑婧愭湇锷″櫒銆
璋幂敤鎺ュ彛锛氢娇鐢℉TTP瀹㈡埛绔璋幂敤鎺ュ彛锛屽彲浠ヤ娇鐢↗ava镊甯︾殑URLConnection銆丠ttpClient绛夌被搴掳纴涔熷彲浠ヤ娇鐢ㄧ涓夋柟搴揿侫pache HttpClient銆丱kHttp绛夈傚湪璋幂敤鎺ュ彛镞讹纴闇瑕佷紶阃掕锋眰鍙傛暟鍜岃幏鍙栧搷搴旂粨鏋溿
澶勭悊鍝嶅簲缁撴灉锛氩规帴鍙h繑锲炵殑鍝嶅簲缁撴灉杩涜屽勭悊锛岃В鏋愬搷搴旀暟鎹骞惰繘琛屼笟锷¢昏緫澶勭悊銆
寮傚父澶勭悊锛氩规帴鍙h皟鐢ㄨ繃绋嬩腑鍙鑳藉嚭鐜扮殑寮傚父杩涜屽勭悊锛屽寘𨰾缃戠粶寮傚父銆佹湇锷″櫒寮傚父绛夈
娴嬭瘯鍜岃皟璇曪细瀵规帴鍙h繘琛屾祴璇曞拰璋冭瘯锛岀‘淇濇帴鍙g殑姝g‘镐у拰绋冲畾镐с
鏂囨。鍖栵细瀵规帴鍙h繘琛屾枃妗e寲锛屽寘𨰾鎺ュ彛镄勪娇鐢ㄦ柟娉曘佽锋眰鍙傛暟鍜屽搷搴旂粨鏋灭殑鏁版嵁镙煎纺绛夈
浠ヤ笂鏄锘烘湰镄勬帴鍙e规帴娴佺▼锛屽叿浣撶殑瀹炵幇鏂瑰纺鍙浠ユ牴鎹瀹为檯𨱍呭喌杩涜岃皟鏁村拰浼桦寲銆
D. Java中的接口怎么实现
举个面积的例子:在java中,定义一个接口,声明计算长方形面积和周长的抽象方法,再用一个类去实现这个接口,再编写一个测试类去使用这个接口。首先,接口必须单独存放,如果我们用eclipse编程的话,它们提示:The public type **** must be defined in its own file,意思是必须要定义在其自己的文件中,所以要为接口文件单独存放起来,举例,我们的接口滑扰要实现获到矩形的长,宽,面积,周长,所以定义以下的接口。public interface calrect {x0dx0apublic abstract int calarea();x0dx0apublic abstract int calgirth();x0dx0apublic abstract int getx();x0dx0apublic abstract int gety();x0dx0a}注意,定义接口就像定义类一样,接口的访问控制符只能用public,用public定义的接口可以被所有的类和包引用,而缺省的则只能罩纳被同一个包中的其他类和接口引用,这符合JAVA中访问控制符的一般要求,关于接口再引用其他接口则是后话。以上接口文件名为calrect.java.另外需要指出的是接口中不能给方法给出方法体。接下来,需要定义一个类来实现接口,因为不知道JAVA的内置矩形类是什么名,所以为了安全,将该类定义为RRect,这可以认为是一物让没种安全策略。关于implements,可以参考其他资料。该类引用了接口calrect,所以必须对calrect中的方法一一实现。//定义矩形类 应用接口class RRect implements calrect{private int x;x0dx0aprivate int y;public RRect (){x0dx0a x=3;y=4;x0dx0a}x0dx0apublic int calarea(){x0dx0a return x*y;x0dx0a}x0dx0apublic int calgirth(){x0dx0a return x*2+y*2;x0dx0a}x0dx0apublic int getx(){x0dx0a return x;x0dx0a}x0dx0apublic int gety(){x0dx0a return y;x0dx0a}x0dx0a}//接下来,定义一个测试类,所谓测试类,我理解为定义一个类,在其定义类RRect的对象,并验证其中的方法,看看是不是可以正常使用//定义Class1类x0dx0apublic class Class1{x0dx0aRRect rect;x0dx0apublic static void main(String []args){x0dx0a RRect rect=new RRect();x0dx0a System.out.println("矩阵的长"+ rect.getx());x0dx0a System.out.println("矩阵的宽"+ rect.calarea());x0dx0a System.out.println("矩阵的面积"+ rect.calarea());x0dx0a System.out.println("矩形的周长 "+rect.calgirth());x0dx0a}x0dx0ax0dx0a}运行结果:矩阵的长3x0dx0a矩阵的宽12x0dx0a矩阵的面积12x0dx0a矩形的周长 14注:接口单存放,接口实现类和测试类可以存放在一个文件中
E. java怎么定义一个接口
java中接口的定义和接口的实现
1.接口的定义
使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。
例如,定义一个用于计算的接口,在该接口中定义了一个常量PI和两个方法,具体代码如下:
1 public interface CalInterface
2 {
3 final float PI=3.14159f;//定义用于表示圆周率的常量PI
4 float getArea(float r);//定义一个用于计算面积的方法getArea()
5 float getCircumference(float r);//定义一个用于计算周长的方法getCircumference()
6 }
注意:
与Java的类文件一样,接口文件的文件名必须与接口名相同。
2.接口的实现
接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字implements,其基本格式如下:
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。
类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。
implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。
在类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。例如,编写一个名称为Cire的类,该类实现5.7.1节中定义的接口Calculate,具体代码如下:
1 public class Cire implements CalInterface
2 {
3 public float getArea(float r)
4 {
5 float area=PI*r*r;//计算圆面积并赋值给变量area
6 return area;//返回计算后的圆面积
7 }
8 public float getCircumference(float r)
9 {
10 float circumference=2*PI*r; //计算圆周长并赋值给变量circumference
11 return circumference; //返回计算后的圆周长
12 }
13 public static void main(String[] args)
14 {
15 Cire c = new Cire();
16 float f = c.getArea(2.0f);
17 System.out.println(Float.toString(f));
18 }
19 }
在类的继承中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔。这时就可能出现常量或方法名冲突的情况,解决该问题时,如果常量冲突,则需要明确指定常量的接口,这可以通过“接口名.常量”实现。如果出现方法冲突时,则只要实现一个方法就可以了。下面通过一个具体的实例详细介绍以上问题的解决方法。
F. java中接口可以实现多个接口吗
首先,java中的接口别说实现多个接口了,一个接口也不能实现。因为接口中的方法是没有方法体的,所以不能实现任何接口。
其次,一个接口可以继承多个接口。因为类如果可以多继承,实例化时,如果要调用父类的方法,如果两个一样,根本就不知道该调用那个父类的方法; 但是接口就不一样了,因为接口继承多个接口,就算多个接口有相同的方法,但是最终实现接口的类只能实现一个方法且@Override一个方法,所以调用时就不会有问题了。
至于抽象类和普通类一样,因为抽象类中可以有普通的方法(带有方法体),也可以有抽象方法,所以抽象类可以实现多个接口。
G. java涓鎺ュ彛镄勫疄鐜扮被鏄浠涔堟剰镐
涓涓鎶借薄绫涓镄勬墍链夋柟娉曢兘鏄鎶借薄镄,灏卞彲浠ュ皢杩欎釜绫荤敤鍙﹀栦竴绉嶆柟寮忔潵瀹氢箟,涔熷氨鏄鎺ュ彛瀹氢箟銆
鎺ュ彛鏄鎶借薄鏂规硶鍜甯搁噺鍊肩殑瀹氢箟镄勯泦钖,浠庢湰璐ㄤ笂璁诧纴鎺ュ彛鏄涓绉岖壒娈婄殑鎶借薄绫,杩欑嶆娊璞$被涓鍙鍖呭惈甯搁噺鍜屾柟娉旷殑瀹氢箟,钥屾病链夊彉閲忓拰鏂规硶镄勫疄鐜
鍙浠ヤ娇鐢╡xtends𨱒ョ户镓挎帴鍙g殑甯搁噺鍜屾娊璞℃柟娉曪纴浣嗗畠涓庣被涓镄别xtends涓嶅悓锛屽畠鍙浠ョ户镓挎湁澶氢釜鐖舵帴鍙(澶氶吨缁ф圹)锛屽悇鐖舵帴鍙i棿鐢ㄩ楀彿闅斿紑銆
鎺ュ彛涓镄勬墍链夊父閲忓繀椤绘槸public static final锛屾柟娉曞繀椤绘槸public abstract锛岃繖鏄绯荤粺榛樿ょ殑锛屼笉绠′綘鍦ㄥ畾涔夋帴鍙f椂锛屽啓涓嶅啓淇楗扮﹂兘鏄涓镙风殑
瀹氢箟鎺ュ彛
淇楗扮 interface 鎺ュ彛钖 [extends 鐖舵帴鍙e垪琛╙
{
甯搁噺锘熷0鏄
鎶借薄鏂规硶澹版槑
}
class cat implements Animal
{
public void shout ()
{
System.out.print(钬滃柕锽碘);
}
}
瀹炵幇鎺ュ彛
implements
涓涓绫诲彲浠ュ疄鐜拌嫢骞蹭釜鎺ュ彛
闱炴娊璞$被蹇呴’瀹炵幇镓链夌殑鎶借薄鏂规硶
interface prt
{
public void prtln();
}
class A implements prt{
int a = 3;
public void prtln()
{
//杈揿嚭a;
}
}
class B implements prt{
int b = 4;
public void prtln()
{
//杈揿嚭b;
}
}
public class MyInterfaceDemo
{
public static void dost(prt c)
{
c.prtln();
}
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
MyInterfaceDemo.dost(a1);
MyInterfaceDemo.dost(b1);
}
}