在Java中,當生成一個內(nèi)部類的對象時,此對象與制造它的外部類通過外部類的.this保持著聯(lián)系,因此該內(nèi)部類對象可以訪問其外部類對象的所有成員,包括private成員。
而該內(nèi)部類對象對于其他類的對象的訪問,遵照常規(guī)的訪問權(quán)限語法,這一點也沒有什么特別支持。這里需要探討的是,外部類以及其他類的對象可以如何訪問到某個內(nèi)部類對象,即內(nèi)部類的可見性問題。
下面是一個示例程序Out.java,其中包含了4個不同訪問權(quán)限的內(nèi)部類(private,default,protected,public),在每個內(nèi)部類中,分別包含4個不同訪問權(quán)限的成員與方法。在外部類Out中提供了得到內(nèi)部類實例的方法。
Out.java
package com.zj.main;
public class Out {
public PrivateIn getPrivateIn(){
return new PrivateIn();
}
public DefaultIn getDefaultIn(){
return new DefaultIn();
}
public ProtectedIn getProtectedIn(){
return new ProtectedIn();
}
public PublicIn getPublicIn(){
return new PublicIn();
}
private class PrivateIn implements InMethod{
private int private_arg;
int default_arg;
protected int protected_arg;
public int public_arg;
private void private_method(){};
void default_method(){};
填寫下面表單即可預約申請免費試聽java課程!害怕學不會?助教陪讀,隨時解惑!擔心就業(yè)?一地學習,可全國推薦就業(yè)!
protected void protected_method(){};
public void public_method(){};
}
class DefaultIn implements InMethod{
private int private_arg;
int default_arg;
protected int protected_arg;
public int public_arg;
private void private_method(){};
void default_method(){};
protected void protected_method(){};
public void public_method(){};
}
protected class ProtectedIn implements InMethod{
private int private_arg;
int default_arg;
protected int protected_arg;
public int public_arg;
private void private_method(){};
void default_method(){};
protected void protected_method(){};
public void public_method(){};
}
public class PublicIn implements InMethod{
private int private_arg;
int default_arg;
protected int protected_arg;
public int public_arg;
private void private_method(){};
void default_method(){};
protected void protected_method(){};
public void public_method(){};
}
public static void main(String[] args){
//create an outer object
Out out=new Out();
//create a private inner object by 'new'
Out.PrivateIn privateIn=out.new PrivateIn();
privateIn.private_arg=0;
privateIn.private_method();
// create a private inner object by 'out's method'
Out.PrivateIn privateIn2 = out.getPrivateIn();
privateIn2.private_arg = 0;
privateIn2.private_method();
}
}
所有的4個內(nèi)部類都實現(xiàn)了一個接口InMethod,該接口的作用在下文中會有討論。下面先討論內(nèi)部類所在的外部類對其內(nèi)部類對象的訪問權(quán)限問題。
1.外部類的訪問
我們通過兩種兩種方式試圖創(chuàng)建內(nèi)部類的實例。
方式一 OuterClassName.InnerClassName inner=new Ouer().new Inner();
通過外部類對象.new 的方式,可以得到private inner class 的實例,并且可以訪問它的private成員和private方法。自然default、protected和public的都可以訪問。
方式二 通過外部類方法get InnerInstance()
此種方法也可以訪問所有內(nèi)部類的所有成員和方法。
所以,一個內(nèi)部類的對象對生成它的外部類對象是完全可見的,包括private內(nèi)部類、private成員與private方法。
2.同包其他類的訪問
下面,在同一個包內(nèi)創(chuàng)建一個SamePackage.java類,試圖訪問Out類的所有內(nèi)部類。
SamePackage.java
package com.zj.main;
public class SamePackage {
public static void main(String[] args) {
// create an outer object
Out out = new Out();
//create a private inner object by 'new'
//Out.PrivateIn privateIn=out.new PrivateIn();
//->error: Out.PrivateIn is not visible.
// create a default inner object by 'new'
Out.DefaultIn defaultIn = out.new DefaultIn();
//defaultIn.private_arg=0;->error:not visible
defaultIn.default_arg = 0;
//defaultIn.private_method();->error:not visible
defaultIn.default_method();
// create a private inner object by 'out's method'
//Out.PrivateIn privateIn2 = out.getPrivateIn();
//->error:Out.PrivateIn is not visible through out.getPrivateIn() is visible.
// create a private inner object by 'out's method',
// but use Interface reference to handle it
InMethod privateIn=out.getPrivateIn();
privateIn.public_method();
}
}
方式一 OuterClassName.InnerClassName inner=new Ouer().new Inner();
使用方式一試圖得到private 內(nèi)部類失敗,根本得不到內(nèi)部類的句柄。
//create a private inner object by 'new'
//Out.PrivateIn privateIn=out.new PrivateIn();
//->error: Out.PrivateIn is not visible.
但是可以正常的訪問default訪問權(quán)限的內(nèi)部類的對象。當然是訪問不到它的private成員和private方法的。自然protected和public的都可以訪問。
方式二 通過外部類方法get InnerInstance()
雖然可以調(diào)用外部類對象的getInnerInstance()方法,但由于得不到private內(nèi)部類的句柄,所以此種方法無法創(chuàng)建private內(nèi)部類的實例。
// create a private inner object by 'out's method'
//Out.PrivateIn privateIn2 = out.getPrivateIn();
//->error:Out.PrivateIn is not visible through out.getPrivateIn() is visible.
但由于所有的內(nèi)部類都實現(xiàn)了接口InMethod。
<> InMethod.java
public interface InMethod {
void public_method();
}
所以還是可以通過接口的引用訪問到private內(nèi)部類的public方法。自然default、protected和public的都可以訪問這個public方法。
// create a private inner object by 'out's method',
// but use Interface reference to handle it
InMethod privateIn=out.getPrivateIn();
privateIn.public_method();
3.不同包其他類的訪問
在另一個包中建立一個類DifferPackage.java。
DifferPackage.java
package com.zj.other;
import com.zj.main.InMethod;
import com.zj.main.Out;
public class DifferPackage {
public static void main(String[] args){
//create an outer object
Out out=new Out();
//create a public inner object by 'new'
Out.PublicIn publicIn=out.new PublicIn();
publicIn.public_arg=0;
publicIn.public_method();
// create a public inner object by 'out's method'
Out.PublicIn publicIn2 = out.getPublicIn();
publicIn2.public_arg=0;
publicIn2.public_method();
//use Interface reference
InMethod method;
method=out.getPrivateIn();
method.public_method();
method=out.getDefaultIn();
method.public_method();
method=out.getProtectedIn();
method.public_method();
method=out.getPublicIn();
method.public_method();
}
}
通過new方式和getInnerInstance()方法只能訪問public內(nèi)部類的public成員和public方法;如果使用接口的引用,則可以訪問所有4個內(nèi)部類的public方法。
4.不同包繼承類的訪問
在另一個包中建立一個類DifferPackageExtend.java,它繼承自外部類Out。
DifferPackageExtend.java
package com.zj.other;
import com.zj.main.Out;
public class DifferPackageAndExtend extends Out{
public static void main(String[] args){
//create an DifferPackageAndExtend's object,which extends Out
Out extend=new DifferPackageAndExtend();
//create a protected inner object by 'new'
//Out.ProtectedIn protectedIn=extend.new ProtectedIn();
//->error:The constructor Out.ProtectedIn() is not visible
// create a protected inner object by 'out's method'
Out.ProtectedIn protectedIn=extend.getProtectedIn();
protectedIn.public_arg=0;
protectedIn.public_method();
}
}
通過new方式,雖然可以得到內(nèi)部類的句柄Out.ProtectedIn,但該內(nèi)部類的構(gòu)造子卻不可見。
通過getInnerInstance()方法得到protected內(nèi)部類的對象,但只能訪問到public成員和public方法。由此可知,protected內(nèi)部類并不關(guān)心是否有其他類繼承自它的外部類。所有protected訪問權(quán)限不在此種情況下適用。
如果你現(xiàn)在想學習Java,贏取高薪工作機會,非常簡單,填寫下面信息,學好Java技術(shù)高薪工作機會唾手可得。
上一篇:不會JDBC連接Oracle數(shù)據(jù)庫?沒關(guān)系教你十個應對技巧
下一篇: 沒有了
初級會計職稱中級會計職稱經(jīng)濟師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導游考試社會工作者司法考試職稱計算機營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護士資格證初級護師主管護師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學理論中醫(yī)理論