java变量访问权限_JAVA成员变量的访问权限
成員變量的訪問(wèn)權(quán)限
我看到很多地方談到關(guān)于Java里變量的訪問(wèn)權(quán)限問(wèn)題.
很多地方認(rèn)為對(duì)于默認(rèn)修飾符的理解是這樣的:
不寫時(shí)默認(rèn)為friendly
但就我所知Java里沒(méi)有 friendly這一關(guān)鍵字.
當(dāng)然學(xué)過(guò)C++的人都知道,在C++里有 friendly,而且其訪問(wèn)權(quán)限和Java里不寫時(shí)默認(rèn)情況一樣.
我覺(jué)的可以這樣理解,但不能這么認(rèn)為.C++和Java畢竟是兩種不同的語(yǔ)言,許多規(guī)則是不同的.
如果我說(shuō)的有哪里不正確,請(qǐng)大家改正,謝謝.
訪問(wèn)權(quán)限修飾符聲明了成員變量的訪問(wèn)權(quán)限。Java提供的顯示的訪問(wèn)權(quán)限修飾符有3種,分別是:私有(private)、保護(hù)(protected)和公 共(public)。除此之外,還有一種默認(rèn)的訪問(wèn)權(quán)限:friendly,它并不是Java的關(guān)鍵字,只有當(dāng)變量前面沒(méi)有寫明任何訪問(wèn)權(quán)限修飾符時(shí),就 默認(rèn)以friendly作為訪問(wèn)權(quán)限。為了表達(dá)上的方便,省略了其中"成員"兩字,將被這些修飾符所修飾的變量分別稱為私有變量、保護(hù)變量和公共變量。下 面分別討論各個(gè)修飾符的用法。
1.公共變量
凡是被public修飾的成員變量,都稱為公共變量,它可以被任何類所訪問(wèn)。即允許該變量所屬的類中所有方法訪問(wèn),也允許其他類在外部訪問(wèn)。
公共變量使用示例。
public class declarePublic{
public int publicVar=10; //定義一個(gè)公共變量
}
在類declarePublic中聲明了一個(gè)公共變量publicVar,它可以被任何類所訪問(wèn)。下面這段程序中,類otherClass可以合法地修改變量publicVar的值,而無(wú)論otherClass位于什么地方。
public class otherClass{
void change(){
declarePublic ca=new declarePublic(); //創(chuàng)建一個(gè)declarePublic對(duì)象
ca.publicVar=20; //通過(guò)對(duì)象名來(lái)訪問(wèn)它的公共變量,正確
}
}
用public修飾的變量,允許任何類在外部直接訪問(wèn),這破壞了封裝的原則,造成數(shù)據(jù)安全性能下降,所以除非有特別的需要,否則不要使用這種方案。
2.私有變量凡是被private修飾的成員變量,都稱為私有變量。它只允許在本類的內(nèi)部訪問(wèn),任何外部類都不能訪問(wèn)它。
私有變量使用示例。
public class declarePrivate{
private int privateVar=10; //定義一個(gè)私有變量
void change(){
privateVar=20; //在本類中訪問(wèn)私有變量,合法
}
}
如果企圖在類的外部訪問(wèn)私有變量,編譯器將會(huì)報(bào)錯(cuò)。
public class otherClass{
void change(){
declarePrivate ca=new declarePrivate(); //創(chuàng)建一個(gè)declarePrivate對(duì)象
ca.privateVar=20; //企圖訪問(wèn)私有變量,非法
}
}
為了讓外部用戶能夠訪問(wèn)某些私有變量,通常類的設(shè)計(jì)者會(huì)提供一些方法給外部調(diào)用,這些方法被稱為訪問(wèn)接口。下面是一個(gè)改寫過(guò)的declarePrivate類。
public class declarePrivate{
private int privateVar=10; //定義一個(gè)私有變量
void change(){
privateVar=20;
}
public int getPrivateVar(){ //定義一個(gè)接口,返回私有變量privateVar的值
return privateVar;
}
public boolean setPrivateVar(int value){ //定義一個(gè)接口,可以設(shè)置privateVar
的值
//可以在這里先檢測(cè)value是否在允許的范圍內(nèi),然后再執(zhí)行下面的語(yǔ)句。
privateVar = value;
return true;
}
}
私有變量很好地貫徹了封裝原則,所有的私有變量都只能通過(guò)程序員設(shè)計(jì)的接口來(lái)訪問(wèn),任何外部使用者都無(wú)法直接訪問(wèn)它,所以具有很高的安全性。但是,在下面這兩種情況下,需要使用Java另外提供的兩種訪問(wèn)類型:
通過(guò)接口訪問(wèn)私有變量,將降低程序的性能,在程序性能比較重要的情況下,需要在安全性和效率間取得一個(gè)平衡。
私有變量無(wú)法被子類繼承,當(dāng)子類必須繼承成員變量時(shí),需要使用其他的訪問(wèn)類型。
3.保護(hù)變量
凡是被protected修飾的變量,都被稱為保護(hù)變量。除了允許在本類的內(nèi)部訪問(wèn)之外,還允許它的子類以及同一個(gè)包中的其他類訪問(wèn)。子類是指從該類派生出來(lái)的類。包是Java中用于管理類的一種松散的集合。二者的詳細(xì)情況將在第4章介紹。下面是一個(gè)簡(jiǎn)單的例子。
保護(hù)變量使用示例。
下面這個(gè)程序先定義一個(gè)名為onlyDemo的包,declarProtected類就屬于這個(gè)包。
public class declareProtected{
protected int protectedVar=10; //定義一個(gè)保護(hù)變量
void change(){
protectedVar=20; //合法
}
}
說(shuō)明:讀者編譯這個(gè)文件時(shí),需要用這個(gè)命令(下同):
javac -d . 文件名
下面這個(gè)otherClass類也定義在onlyDemo包中,與declareProtected類同屬于一個(gè)包。
public class otherClass{ //它也在包onlyDemo中
void change(){
declareProtected ca=new declareProtected();
ca.protectedVar=20; //合法
}
}
下面這個(gè)deriveClass類是declareProtected的子類,它并不在onlyDemo包中。它也可以訪問(wèn)保護(hù)變量protectedVar,但是只能通過(guò)繼承的方式訪問(wèn)。
import onlyDemo.declareProtected; //引入需要的包
public class deriveClass extends declareProtected{ //定義一個(gè)子類
void change(){
//合法,改變的是deriveClass從declarProtected中所繼承的protectedVar值
protectedVar=30;
}
}
說(shuō)明:import是Java中的關(guān)鍵字,用于引入某個(gè)包。這將在4.13節(jié)中詳細(xì)介紹。
子類如果不在父類的同一包中,是無(wú)法通過(guò)"對(duì)象名.變量名"的方式來(lái)訪問(wèn)protected類型的成員變量,比如下面這種訪問(wèn)是非法的:
import onlyDemo.declareProtected;
public class deriveClass extends declareProtected{ //定義一個(gè)子類
void change(){
declareProtected ca=new declareProtected();
ca.protectedVar=30; //錯(cuò)誤,不允許訪問(wèn)不在同一包中的保護(hù)變量
}
}
4.默認(rèn)訪問(wèn)變量
如果在變量前不加任何訪問(wèn)權(quán)修飾符,它就具有默認(rèn)的訪問(wèn)控制特性,也稱為friendly變量。它和保護(hù)變量非常像,它只允許在同一個(gè)包中的其他類訪問(wèn), 即便是子類,如果和父類不在同一包中,也不能繼承默認(rèn)變量(這是默認(rèn)訪問(wèn)變量和保護(hù)變量的唯一區(qū)別)。因?yàn)樗薅嗽L問(wèn)權(quán)限只能在包中,所以也有人稱默認(rèn) 訪問(wèn)權(quán)限為包訪問(wèn)權(quán)限。
默認(rèn)訪問(wèn)變量使用示例。
package onlyDemo; //本類定義在包中
public class declareDefault{
int defaultVar=10; //定義一個(gè)默認(rèn)訪問(wèn)變量
void change(){
defaultVar=20; //合法
}
}
onlyDemo包中的其他類,可以訪問(wèn)defaultVar變量:
package onlyDemo;
public class otherClass{ //它也在包onlyDemo中
void change(){
declareDefault ca=new declareDefault();
ca.defaultVar=20; //合法
}
}
下面是它的子類,也在onlyDemo包中。它除了可以像包中其他類那樣通過(guò)"對(duì)象名.變量名"來(lái)訪問(wèn)默認(rèn)變量,還可以通過(guò)繼承的方式來(lái)訪問(wèn)。
package onlyDemo;
public class deriveClass extends declareDefault{ //定義一個(gè)子類
void change(){
//合法,改變的是deriveClass從declarDefault中所繼承的defaultVar值
defaultVar=30;
}
}
如果子類不在onlyDemo包中,就不會(huì)繼承默認(rèn)變量,也就無(wú)法像上面那樣來(lái)訪問(wèn)。
import onlyDemo.declareDefault;
public class deriveClass extends declareDefault{ //定義一個(gè)子類
void change(){
defaultVar=30; //非法,這個(gè)變量沒(méi)有繼承下來(lái)
}
}
總結(jié)
以上是生活随笔為你收集整理的java变量访问权限_JAVA成员变量的访问权限的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java求面积_Java之简单图形面积计
- 下一篇: xpcom java_[Mozilla]