類成員的訪問修飾符
Java中的訪問修飾符
Java面向對象的基本思想之一是封裝細節並且公開介面。Java語言採用訪問控制修飾符來控制類及類的方法和變數的訪問許可權,從而向使用者暴露介面,但隱藏實現細節。訪問控制分為四種級別:
(1)public: 用public修飾的類、類屬變數及方法,包內及包外的任何類(包括子類和普通類)均可以訪問;
(2)protected: 用protected修飾的類、類屬變數及方法,包內的任何類及包外那些繼承了該類的子類才能訪問(此處稍後解釋),protected重點突出繼承;
(3)default: 如果一個類、類屬變數及方法沒有用任何修飾符(即沒有用public、protected及private中任何一種修飾),則其訪問許可權為default(默認訪問許可權)。默
認訪問許可權的類、類屬變數及方法,包內的任何類(包括繼承了此類的子類)都可以訪問它,而對於包外的任何類都不能訪問它(包括包外繼承了此類的子類)。default重點突出包;
(4)private: 用private修飾的類、類屬變數及方法,只有本類可以訪問,而包內包外的任何類均不能訪問它。
網上一些資料及一些書上用表格對java訪問修飾符做了清楚的總結,如下表所示:
重要總結:通過上面的分析,我們可以看到:
1.public、private和protected對我們來說沒有任何異議。
2. 頂層類只能用public訪問修飾符和default(默認)訪問修飾符修飾,其中用默認修飾符修飾的類(及沒有任何修飾符的類,如class B{})不能被其他包中的類繼承,這也說明了default(默認)訪問修飾符突出的是包許可權
3. protected:本人做了一次實驗,發現在不同包的子類中,new一個父類對象,並用該父類對象去訪問父類中的用protected修飾的類屬變數和方法時不能訪問,而new一個子類對象時,子類對象可以訪問(說明protected修飾的類可以被其他包中的類繼承)。也可以在子類重寫父類的方法中使用super關鍵字調用。這豈不是和上面表格中的總結(紅色對勾)沖突了?本人也是百思不得其解。最後在網上找到了一個相對比較認可的解釋,如下:
protected修飾符的修飾的成員變數和方法也稱為受保護的成員變數和方法, 受保護的成員變數和方法可以在本類或同一個包中的其它類(包括子類)中通過類的實例進行訪問,也可以被同一個包中的類或不同包中的類繼承,但是不能在不同包中的其它類(包括子類)中通過類的實例進行訪問。
4. 如果一個類使用public修飾,那該類的類名必須與他所在的源文件名相同。一個.java源文件中有且只有一個public類,頂層類只能用public和默認修飾符(即無修飾符)修飾;
5.final修飾的類不能被繼承,沒有子類。
6.abstract修飾的類不能被實例化,必須被子類繼承。類只要有一個抽象方法就必定是抽象類,但抽象類不一定要有抽象方法。
最終總結,就一句話:protected修飾符所修飾的類(這句話中指父類)屬成員變數和方法,只可以被子類訪問,而不管子類是不是和父類位於同一個包中。default修飾符所修飾的類屬成員變數和方法,只可被同一個包中的其他類訪問,而不管其他類是不是該類的子類。protected屬於子類限制修飾符,而default屬於包限制修飾符。
⑵ java中類成員的訪問修飾符有哪些
一:訪問修飾符:
1.省略訪問修飾符
具有默認的訪問特性,即具有包訪問特性,只能被同一個包中的類使用。
2.public訪問修飾符
用於說明類和類的成員的訪問許可權。這種類叫公有類。在一個文件中只能有一個public類型的類。
例如:Rect和UseImport兩個類,分別在兩個不同的包中。順便回顧一下不同類要用import導入。(哎,一直就沒記住)
//Rect.java
pacakage
my;
public
class
Rect
{
private
int
a,b;
public
void
init(int
len,int
width)
{
a=len;
b=width;
}
public
int
area()
{
return
a*b;
}
}
//UseImport.java
import.my.*;//導入my
包的所有類
public
class
UseImport
{
public
static
void
main(string[]
args)
{
Rect
x=new
Rect();
x.init(2,3);
System.out.println("矩形面積為:"+x.area());
}
}
3.private
用private修飾的類成員成為私有成員,只能在聲明該成員的類中使用,不能在類外使用。一般通過本類中公有方法進行訪問。
4.protected
protected修飾的類成員為保護成員,可以被三種類使用,分別是該類本身,該類的所有子類,該類同包的其他類,該類的子類。
5.private
protected
私有保護成員。可被兩種類使用。分別是:該類本身和該類的所有子類。
二:特徵修飾符
1.abstract:抽象
修飾類為抽象類,修飾方法為抽象方法。只要類中有抽象方法,就必須定義為抽象類。抽象方法只能聲明,不能實現。但是可以在其子類中對抽象方法進行實現。抽象類中也可以包含非抽象方法。
2.final:最終
修飾的類為終止類,不能有子類。修飾變數為終止變數,只可賦值一次。修飾方法為終止方法,不能在子類中更改。如Socket、ServerSocket等都是final類,防止黑客派生子類進行破壞。同時,final與abstract是相互矛盾的。
3.static:靜態
靜態成員無需通過對象調用,可以直接通過類名直接調用。
public
class
RectArea//輸出6
和
12
{
public
static
void
main(String[]
args)
{
System.out.println(area(2,3));
System.out.println(area(3,4));
}
static
void
area(int
a,int
b)
{
return
a*b;
}
}
4.native
用native修飾的為本地方法。它修飾的方法在程序外部使用其他編程語言編寫。(這個步驟比較多,所以就木有繼續研究了)
5.synchronized
修飾的方法為同步方法。
⑶ c#中的類中的5種不同訪問修飾符的含義
這個要看類的位置,
如果類,結構,代理,枚舉是外置的,那修飾符只有:public 和 internal,默認是internal。
至於private和protected是用來修飾類的成員。
如果是內置的,就是作為另一個類型的成員,也稱內部類型(inner type),這樣的話,修飾符可以是全部可用修飾符,默認是private。
舉例:
class a {} 類a是internal
c#中類的默認訪問修飾符,默認是internal :C#用多種修飾符來表達類的不同性質。
根據其保護級 C#的類有五種不同的限制修飾符:public 可以被任意存取;
protected 只可以被本類和其繼承子類存取;
internal只可以被本組合體(Assembly)內所有的類存取,組合體是C# 語言中類被組合後的邏輯單位和物理單位,其編譯後的文件擴展名往往是「.DLL」或「.EXE」protected internal唯一的一種組合限制修飾符,它只可以被本組合體內所有的類和這些類的繼承子類所存取。
private 只可以被本類所存取。如果不是嵌套的類,命名空間或編譯單元內的類只有public和internal兩種修飾。
new 修飾符只能用於嵌套的類,表示對繼承父類同名類型的隱藏。
abstract 用來修飾抽象類,表示該類只能作為父類被用於繼承,而不能進行對象實例化。
抽象類可以包含抽象的成員,但這並非必須。abstract 不能和new 同時用
⑷ 請問:java類成員訪問修飾符的限制范圍
public:Java語言中訪問限制最寬的修飾符,一般稱之為「公共的」。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包(package)訪問。
private:Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為「私有的」。被其修飾的類、屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。
protect:介於public和private之間的一種訪問修飾符,一般稱之為「保護形」。被其修飾的類、屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
default:即不加任何訪問修飾符,通常稱為「默認訪問模式「。該模式下,只允許在同一個包中進行訪問。
⑸ 請問:java類成員訪問修飾符的限制范圍
public
訪問范圍最大,也就是任何其他類都可以調用這個類的方法或屬性。
private
訪問范圍最小,也就是只能在這個類的內部使用,外部調用不了
protected
訪問范圍算是中間,只有本類和子類才能訪問。
⑹ 與C++等語言相比,C#中增加的一個類成員訪問修飾符是什麼謝啦
1. C#中類的修飾符:
public—— 表示不限制對該類的訪問,最開放,所有的本程序集以及其他的程序集裡面的對象都能夠訪問
protected ——表示只能從所在類和所在類派生的子類進行訪問
private ——只有其所在類才能訪問
internal ——本程序集內的成員可以訪問
abstract—— 抽象類不允許建立類的實例。修飾方法的時候表示該方法需要由子類來實現,如果子類沒有實現該方法那麼子類同樣是抽象類;且含有抽象方法的類一定是抽象類
sealed——修飾類時表示該類不能夠被繼承,修飾方法時表示該方法不能被覆寫
partial——部分類,可以將一個類分成幾部分寫在不同文件中,最終編譯時將合並成一個文件,且各個部 分不能分散在不同程序集中
static——修飾類時表示該類時靜態類,不能夠實例化該類的對象,既然不能實例化該類,那麼這個類也 就不能夠含有對象成員,即該類所有成員為靜態
2. C#成員修飾符
類的成員包括構造方法、屬性、方法等。
Public:最開放,所有的本程序集以及其他的程序集裡面的對象都能夠訪問。
Protected: 比較開放,自身成員以及子類成員可訪問。
Private:只有自身成員才能夠訪問。
Internal:本程序集內的成員可以訪問。
Abstract:修飾方法的時候表示該方法需要由子類來實現,如果子類沒有實現該方法那麼子類同樣是抽象類;且含有抽象方法的類一定是抽象類
Sealed:修飾類時表示該類不能夠被繼承,修飾方法時表示該方法不能被覆寫。
Static:修飾類成員時,該成員為類成員,只能通過【類.成員名】的方式訪問。當static修飾構造函數時,構造函數不能含有任何參數,不能含有修飾符,構造函數不能對對象成員進 行初始化操作。但是能夠對靜態成員進行初始化或者調用。不能保證他在什麼時候執行,卻能保證在第一次使用類型前執行。在靜態構造函數中初始化的靜態成員為最終初始化結果。
Virtual:修飾方法成員,表示虛方法。父類可以含有該類的實現,子類可以覆寫該函數。
Override:表示該方法為覆寫了父類的方法。
Readonly:修飾欄位,表示該欄位為只讀欄位。readonly修飾引用類型時由於操作不當可能修改該只讀對象狀態。
Const:修飾欄位,表示該欄位為只讀欄位。並且在編譯時必須能夠明確知道該欄位的值,其值是硬編碼到程序中去的,修改了該類型成員後需要重新編譯才能使修改生效。
abstract:用來修飾抽象類,表示該類只能作為父類被用於繼承,而不能進行對象實例化。抽象類可以包含抽象的成 員,但這並非必須。abstract不能和new同時用。
internal: 當一個類或方法沒有被任何修飾符修飾時,默認為internal。
⑺ Java中成員屬性默認訪問修飾符是什麼
Java中成員屬性默認修飾符為default.
舉個栗子 : 假如有成員變數name,類型為String,則聲明為String name ;
此時該變數的默認許可權修飾符就是default.
下附Java成員許可權修飾符許可權 :
private : 只能在當前類中訪問
default : 只能在當前類以及同一個包下訪問
protected : 除了當前類以及同一個包下訪問外,還為不在同一個包下的子類提供了一種訪問父類成員的方式
public : 同一個工程下,所有包均可訪問.
望採納!如贊同請點贊!您的肯定就是我的動力!