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);
}
}