-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專(zhuān)題列表 > 正文
接口中的方法(接口中的方法默認(rèn)使用什么修飾)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于接口中的方法的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話(huà)答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線(xiàn)網(wǎng)頁(yè)版、PC客戶(hù)端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、java API 文檔中的接口方法和抽象方法,有什么區(qū)別?
對(duì)于面向?qū)ο缶幊虂?lái)說(shuō),抽象是它的一大特征之一??梢酝ㄟ^(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類(lèi)。這兩者有太多相似的地方,又有太多不同的地方。很多人在初學(xué)的時(shí)候會(huì)以為它們可以隨意互換使用,但是實(shí)際則不然。今天我們就一起來(lái)學(xué)習(xí)一下Java中的接口和抽象類(lèi)。 抽象方法是一種特殊的方法:它只有聲明,而沒(méi)有具體的實(shí)現(xiàn)。抽象方法的聲明格式為: abstract void fun(); 抽象方法必須用abstract關(guān)鍵字進(jìn)行修飾。如果一個(gè)類(lèi)含有抽象方法,則稱(chēng)這個(gè)類(lèi)為抽象類(lèi),抽象類(lèi)必須在類(lèi)前用abstract關(guān)鍵字修飾。因?yàn)槌橄箢?lèi)中含有無(wú)具體實(shí)現(xiàn)的方法,所以不能用抽象類(lèi)創(chuàng)建對(duì)象。抽象類(lèi)就是為了繼承而存在的,如果你定義了一個(gè)抽象類(lèi),卻不去繼承它,那么等于白白創(chuàng)建了這個(gè)抽象類(lèi),因?yàn)槟悴荒苡盟鼇?lái)做任何事情。對(duì)于一個(gè)父類(lèi),如果它的某個(gè)方法在父類(lèi)中實(shí)現(xiàn)出來(lái)沒(méi)有任何意義,必須根據(jù)子類(lèi)的實(shí)際需求來(lái)進(jìn)行不同的實(shí)現(xiàn),那么就可以將這個(gè)方法聲明為abstract方法,此時(shí)這個(gè)類(lèi)也就成為abstract類(lèi)了。在軟件工程中,接口泛指供別人調(diào)用的方法或者函數(shù)。從這里,我們可以體會(huì)到Java語(yǔ)言設(shè)計(jì)者的初衷,它是對(duì)行為的抽象。接口中可以含有變量和方法。但是要注意,接口中的變量會(huì)被隱式地指定為public static final變量(并且只能是public static final變量,用private修飾會(huì)報(bào)編譯錯(cuò)誤),而方法會(huì)被隱式地指定為public abstract方法且只能是public abstract方法(用其他關(guān)鍵字,比如private、protected、static、 final等修飾會(huì)報(bào)編譯錯(cuò)誤),并且接口中所有的方法不能有具體的實(shí)現(xiàn),也就是說(shuō),接口中的方法必須都是抽象方法。從這里可以隱約看出接口和抽象類(lèi)的區(qū)別,接口是一種極度抽象的類(lèi)型,它比抽象類(lèi)更加“抽象”,并且一般情況下不在接口中定義變量。
二、JAVA 中,接口中所有方法均為_(kāi)_______和________的。
public 和 abstract
接口是為了讓其他類(lèi)集成的,所以應(yīng)該是 public的,因?yàn)榻涌谥袥](méi)有方法實(shí)現(xiàn),成員也是共有的,同時(shí)這些都是未實(shí)現(xiàn)的,所以就應(yīng)該是抽象的
三、如何在Java類(lèi)中定義接口屬性并如何使用接口的方法
摘要
一, 接口基礎(chǔ)知識(shí)
1, java語(yǔ)言不支持一個(gè)類(lèi)有多個(gè)直接的父類(lèi)(多繼承),但可以實(shí)現(xiàn)(implements)多個(gè)接口,間接的實(shí)現(xiàn)了多繼承.
2, 與接口相關(guān)的設(shè)計(jì)模式:
1, 定制服務(wù)模式
設(shè)計(jì)精粒度的接口,每個(gè)接口代表相關(guān)的一組服務(wù),通過(guò)繼承來(lái)創(chuàng)建復(fù)合接口
2, 適配器模式
當(dāng)每個(gè)系統(tǒng)之間接口不匹配時(shí),用適配器來(lái)轉(zhuǎn)換接口
3, 默認(rèn)適配器模式
為接口提供簡(jiǎn)單的默認(rèn)實(shí)現(xiàn)
4, 代理模式
為接口的實(shí)現(xiàn)類(lèi)創(chuàng)建代理類(lèi),使用者通過(guò)代理來(lái)獲得實(shí)現(xiàn)類(lèi)的服務(wù)
5, 標(biāo)識(shí)類(lèi)型模式
用接口來(lái)標(biāo)識(shí)一種沒(méi)有任何行為的抽象類(lèi)型
6, 常量接口模式
在接口中定義靜態(tài)常量,在其它類(lèi)中通過(guò)import static語(yǔ)句引入這些常量
3, 接口的特征歸納:
1, 接口中的成員變量默認(rèn)都是public,static,final類(lèi)型的(都可省略),必須被顯示初始化,即接口中的成員變量為常量(大寫(xiě),單詞之間用"_"分隔)
2, 接口中的方法默認(rèn)都是public,abstract類(lèi)型的(都可省略),沒(méi)有方法體,不能被實(shí)例化
public interface A
{
int CONST = 1; //合法,CONST默認(rèn)為public,static,final類(lèi)型
void method(); //合法,method()默認(rèn)為public,abstract類(lèi)型
public abstract void method2(); //method2()顯示聲明為public,abstract類(lèi)型
}
3, 接口中只能包含public,static,final類(lèi)型的成員變量和public,abstract類(lèi)型的成員方法
public interface A
{
int var; //錯(cuò),var是常量,必須顯示初始化
void method(){...}; //錯(cuò),接口中只能包含抽象方法
protected void method2(); //錯(cuò),接口中的方法必須是public類(lèi)型
static void method3(){...}; //錯(cuò),接口中不能包含靜態(tài)方法
}
4, 接口中沒(méi)有構(gòu)造方法,不能被實(shí)例化
public interface A
{
public A(){...}; //錯(cuò),接口中不能包含構(gòu)造方法
void method();
}
5, 一個(gè)接口不能實(shí)現(xiàn)(implements)另一個(gè)接口,但它可以繼承多個(gè)其它的接口
public interface A
{
void methodA();
}
public interface B
{
void methodB();
}
public interface C extends A, B //C稱(chēng)為復(fù)合接口
{
void methodC();
}
public interface C implements A{...} //錯(cuò)
6, 接口必須通過(guò)類(lèi)來(lái)實(shí)現(xiàn)它的抽象方法
public class A implements B{...}
7, 當(dāng)類(lèi)實(shí)現(xiàn)了某個(gè)接口時(shí),它必須實(shí)現(xiàn)接口中的所有抽象方法,否則這個(gè)類(lèi)必須聲明為抽象的
8, 不允許創(chuàng)建接口的實(shí)例(實(shí)例化),但允許定義接口類(lèi)型的引用變量,該引用變量引用實(shí)現(xiàn)了這個(gè)接口的類(lèi)的實(shí)例
public class B implements A{}
A a = new B(); //引用變量a被定義為A接口類(lèi)型,引用了B實(shí)例
A a = new A(); //錯(cuò)誤,接口不允許實(shí)例化
9, 一個(gè)類(lèi)只能繼承一個(gè)直接的父類(lèi),但可以實(shí)現(xiàn)多個(gè)接口,間接的實(shí)現(xiàn)了多繼承.
public class A extends B implements C, D{...} //B為class,C,D為interface
4, 通過(guò)接口,可以方便地對(duì)已經(jīng)存在的系統(tǒng)進(jìn)行自下而上的抽象,對(duì)于任意兩個(gè)類(lèi),不管它們是否屬于同一個(gè)父類(lèi),只有它
們存在相同的功能,就能從中抽象出一個(gè)接口類(lèi)型.對(duì)于已經(jīng)存在的繼承樹(shù),可以方便的從類(lèi)中抽象出新的接口,但從類(lèi)
中抽象出新的抽象類(lèi)卻不那么容易,因此接口更有利于軟件系統(tǒng)的維護(hù)與重構(gòu).對(duì)于兩個(gè)系統(tǒng),通過(guò)接口交互比通過(guò)抽象
類(lèi)交互能獲得更好的松耦合.
5, 接口是構(gòu)建松耦合軟件系統(tǒng)的重要法寶,由于接口用于描述系統(tǒng)對(duì)外提供的所有服務(wù),因此接口中的成員變量和方法都
必須是public類(lèi)型的,確保外部使用者能訪(fǎng)問(wèn)它們,接口僅僅描述系統(tǒng)能做什么,但不指明如何去做,所有接口中的方法
都是抽象方法,接口不涉及和任何具體實(shí)例相關(guān)的細(xì)節(jié),因此接口沒(méi)有構(gòu)造方法,不能被實(shí)例化,沒(méi)有實(shí)例變量.二, 比較抽象類(lèi)與接口
1, 抽象類(lèi)與接口都位于繼承樹(shù)的上層
相同點(diǎn)
1, 代表系統(tǒng)的抽象層,當(dāng)一個(gè)系統(tǒng)使用一顆繼承樹(shù)上的類(lèi)時(shí),應(yīng)該盡量把引用變量聲明為繼承樹(shù)的上層抽象類(lèi)型,
這樣可以提高兩個(gè)系統(tǒng)之間的送耦合
2, 都不能被實(shí)例化
3, 都包含抽象方法,這些抽象方法用于描述系統(tǒng)能提供哪些服務(wù),但不提供具體的實(shí)現(xiàn)
不同點(diǎn):
1, 在抽象類(lèi)中可以為部分方法提供默認(rèn)的實(shí)現(xiàn),從而避免在子類(lèi)中重復(fù)實(shí)現(xiàn)它們,這是抽象類(lèi)的優(yōu)勢(shì),但這一優(yōu)勢(shì)
限制了多繼承,而接口中只能包含抽象方法.
由于在抽象類(lèi)中允許加入具體方法,因此擴(kuò)展抽象類(lèi)的功能,即向抽象類(lèi)中添加具體方法,不會(huì)對(duì)它的子類(lèi)造
成影響,而對(duì)于接口,一旦接口被公布,就必須非常穩(wěn)定,因?yàn)殡S意在接口中添加抽象方法,會(huì)影響到所有的實(shí)
現(xiàn)類(lèi),這些實(shí)現(xiàn)類(lèi)要么實(shí)現(xiàn)新增的抽象方法,要么聲明為抽象類(lèi)
2, 一個(gè)類(lèi)只能繼承一個(gè)直接的父類(lèi),這個(gè)父類(lèi)可能是抽象類(lèi),但一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,這是接口的優(yōu)勢(shì),但這
一優(yōu)勢(shì)是以不允許為任何方法提供實(shí)現(xiàn)作為代價(jià)的三, 為什么Java語(yǔ)言不允許多重繼承呢?
當(dāng)子類(lèi)覆蓋父類(lèi)的實(shí)例方法或隱藏父類(lèi)的成員變量及靜態(tài)方法時(shí),Java虛擬機(jī)采用不同的綁定規(guī)則,假如還允許
一個(gè)類(lèi)有多個(gè)直接的父類(lèi),那么會(huì)使綁定規(guī)則更加復(fù)雜,因此,為了簡(jiǎn)化系統(tǒng)結(jié)構(gòu)設(shè)計(jì)和動(dòng)態(tài)綁定機(jī)制,Java語(yǔ)言
禁止多重繼承.
而接口中只有抽象方法,沒(méi)有實(shí)例變量和靜態(tài)方法,只有接口的實(shí)現(xiàn)類(lèi)才會(huì)實(shí)現(xiàn)接口的抽象方法(接口中的抽象方
法是通過(guò)類(lèi)來(lái)實(shí)現(xiàn)的),因此,一個(gè)類(lèi)即使有多個(gè)接口,也不會(huì)增加Java虛擬機(jī)進(jìn)行動(dòng)態(tài)綁定的復(fù)雜度.因?yàn)镴ava虛
擬機(jī)永遠(yuǎn)不會(huì)把方法與接口綁定,而只會(huì)把方法與它的實(shí)現(xiàn)類(lèi)綁定.四, 使用接口和抽象類(lèi)的總體原則:
1, 用接口作為系統(tǒng)與外界交互的窗口
站在外界使用者(另一個(gè)系統(tǒng))的角度,接口向使用者承諾系統(tǒng)能提供哪些服務(wù),站在系統(tǒng)本身的角度,接口制定
系統(tǒng)必須實(shí)現(xiàn)哪些服務(wù),接口是系統(tǒng)中最高層次的抽象類(lèi)型.通過(guò)接口交互可以提高兩個(gè)系統(tǒng)之間的送耦合
系統(tǒng)A通過(guò)系統(tǒng)B進(jìn)行交互,是指系統(tǒng)A訪(fǎng)問(wèn)系統(tǒng)B時(shí),
把引用變量聲明為系統(tǒng)B中的接口類(lèi)型,該引用變量引用系統(tǒng)B中接口的實(shí)現(xiàn)類(lèi)的實(shí)例.
public interface B
{
}
public class C implements B
{
}
public class A
{
}
B a = new C();
2, 接口本身必須非常穩(wěn)定,接口一旦制定,就不允許隨遇更加,否則對(duì)外面使用者及系統(tǒng)本身造成影響
3, 用抽象類(lèi)來(lái)定制系統(tǒng)中的擴(kuò)展點(diǎn)
抽象類(lèi)來(lái)完成部分實(shí)現(xiàn),還要一些功能通過(guò)它的子類(lèi)來(lái)實(shí)現(xiàn) 2008/1/9
一, Java多態(tài)機(jī)制中的綁定規(guī)則深入剖析
class Base
{
String var = "BaseVar"; //實(shí)例變量
static String staticVar = "StaticBaseVar"; //靜態(tài)變量 void method() //實(shí)例方法
{
System.out.println("Base method");
} static void staticMethod() //靜態(tài)方法
{
System.out.println("Static Base method");
}
}public class Sub extends Base
{
String var = "SubVar"; //實(shí)例變量
static String staticVar = "StaticSubVar"; //靜態(tài)變量
void method() //隱藏父類(lèi)的method()方法
{
System.out.println("Sub method");
} static void staticMethod() //隱藏父類(lèi)的staticMethod()方法
{
System.out.println("Static Sub method");
} String subVar = "Var only belonging to Sub"; void subMethod()
{
System.out.println("method only belonging to Sub");
} public static void main(String args[])
{
//引用變量who被聲明為Base類(lèi)型,引用Sub類(lèi)的實(shí)例
Base who = new Sub();
//成員變量(靜態(tài)變量,實(shí)例變量)與引用變量所聲明的類(lèi)型(Base類(lèi)型)的成員變量綁定
System.out.println("who.var = "+who.var); //所以,打印Base類(lèi)的var變量
System.out.println("who.staticVar = "+who.staticVar); //所以,打印Base類(lèi)的staticVar變量 //實(shí)例方法與引用變量實(shí)際引用的對(duì)象(Sub對(duì)象)的方法綁定
who.method(); //所以,打印Sub實(shí)例的method()方法 //靜態(tài)方法與引用變量所聲明的類(lèi)型(Base類(lèi)型)的方法綁定
who.staticMethod(); //所以,打印Base類(lèi)的staticMethod()方法
}
}
【分析過(guò)程】
1, 對(duì)于一個(gè)引用類(lèi)型的變量,Java編譯器按照它聲明的類(lèi)型來(lái)處理.
例如在以下代碼中,編譯器認(rèn)為who是Base類(lèi)型的引用變量,不存在subVar成員變量喝subMethod()方法,編譯報(bào)錯(cuò)
Base who = new Sub(); //引用變量who被聲明為Base類(lèi)型,引用Sub類(lèi)的實(shí)例
who.subVar = "123"; //編譯錯(cuò),在Base類(lèi)中沒(méi)有subVar屬性
who.subMethod(); //編譯錯(cuò),在Base類(lèi)中沒(méi)有submethod()方法
如果要訪(fǎng)問(wèn)Sub類(lèi)的成員,必須通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換:
Base who = new Sub();
//把Base引用類(lèi)型的who成員變量強(qiáng)制轉(zhuǎn)換為Sub引用類(lèi)型
//把引用變量轉(zhuǎn)換為子類(lèi)的類(lèi)型稱(chēng)為向下轉(zhuǎn)型,把引用變量轉(zhuǎn)換為父類(lèi)的類(lèi)型稱(chēng)為向上轉(zhuǎn)型
((Sub)who).subVar = "123";
((Sub)who).subMethod();
Java編譯器允許在具有直接或間接繼承關(guān)系的類(lèi)之間進(jìn)行類(lèi)型轉(zhuǎn)換,對(duì)于向上轉(zhuǎn)型,Java編譯器會(huì)自動(dòng)進(jìn)行,對(duì)于
向下轉(zhuǎn)型,需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
如果兩種類(lèi)型之間沒(méi)有繼續(xù)關(guān)系,即不在繼承樹(shù)的同一個(gè)繼承分支上,那么Java編譯器不允許進(jìn)行類(lèi)型轉(zhuǎn)換
2, 對(duì)于一個(gè)引用類(lèi)型的變量,運(yùn)行時(shí)Java虛擬機(jī)按照它實(shí)際引用的對(duì)象來(lái)處理
例如以下代碼雖編譯可通過(guò),但運(yùn)行時(shí)會(huì)拋出ClassCastException運(yùn)行時(shí)異常
Base who = new Base(); //who引用Base類(lèi)的實(shí)例
Sub s = (Sub)who; //運(yùn)行時(shí)會(huì)拋出ClassCastException
在運(yùn)行時(shí),子類(lèi)的對(duì)象可以轉(zhuǎn)換為父類(lèi)類(lèi)型,而父類(lèi)的對(duì)象實(shí)際上無(wú)法轉(zhuǎn)換為子類(lèi)類(lèi)型
3, 在運(yùn)行時(shí)環(huán)境中,通過(guò)引用類(lèi)型變量來(lái)訪(fǎng)問(wèn)所引用對(duì)象的方法和屬性時(shí),Java虛擬機(jī)采用以下綁定規(guī)則:
1, 實(shí)例方法與引用變量實(shí)際引用的對(duì)象的方法綁定,這種綁定屬于動(dòng)態(tài)綁定,因?yàn)槭窃谶\(yùn)行時(shí)由Java虛擬機(jī)
動(dòng)態(tài)決定的
2, 靜態(tài)方法與引用變量所聲明的類(lèi)型的方法綁定,這種綁定屬于靜態(tài)綁定,因?yàn)閷?shí)際上是在編譯階段就已經(jīng)
綁定
3, 成員變量(靜態(tài)變量,實(shí)例變量)與引用變量所聲明的類(lèi)型的成員變量綁定,這種綁定屬于靜態(tài)綁定,因?yàn)?/p>
實(shí)際上是在編譯階段就已經(jīng)綁定
四、接口中定義的方法有部分實(shí)現(xiàn)?
下面的例子定義了一個(gè)名為icontrol
的接口,接口中包含一個(gè)成員方法
paint:interface
icontrol
{
void
paint(
)
;}
接口
定義的量都是常量
方法都是虛擬的
接口只能用與實(shí)現(xiàn)
而且方法必須全部被重些
也可以說(shuō)是
高度集中的虛擬類(lèi)
或
更純的虛擬類(lèi)
以上就是關(guān)于接口中的方法相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢(xún),客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
接口可以寫(xiě)普通方法嗎(接口里面可以寫(xiě)方法嗎)
視頻網(wǎng)站api接口破解(視頻網(wǎng)站api接口破解方法)
為什么要寫(xiě)接口(為什么要寫(xiě)接口再用類(lèi)實(shí)現(xiàn))
張雪峰評(píng)價(jià)西安建筑科技大學(xué)(土木工程八大名校)