簡體   English   中英

Java是否具有“私有保護”訪問修飾符?

[英]Does Java have a “private protected” access modifier?

我看到一些引用引用了Java中的一個名為private protected的訪問修飾符(兩個單詞一起):

private protected someMethod() {

}

我發現的其中一個頁面就是這里 我的課程也提到了這個訪問修飾符(並說它存在)。 但是,使用它會導致Java語言出錯。

我嘗試了變量和方法,我很確定它不存在,但我想要解釋發生了什么。 它被考慮了,然后被拒絕了嗎? 或者是否在較新版本的Java中刪除了它?

編輯:我不是在尋找有關protected關鍵字的信息。

刪除訪問修飾符

Java最初有private protected修飾符,但在JDK 1.0.2(第一個穩定版本,我們今天所知的Java 1.0)中刪除了它。 有關JDK 1.0.2( 此處此處 )的一些教程說明如下:

注意:Java語言的1.0版本支持五種訪問級別:上面列出的四種加上private protected 在高於1.0的Java版本中不支持private protected訪問級別; 你不應該再在Java程序中使用它了。

SoftwareEngineering.SE的另一個答案是

Java最初有這樣一個修飾符。 它被寫為private protected但在Java 1.0中被刪除。

現在來看看Java Version History

JDK 1.0

第一個版本於19961月23日發布,名為Oak。 第一個穩定版本JDK 1.0.2稱為Java 1。

從這一點,我們可以得出結論,關於版本1.0.2的教程是指第一個版本JDK 1.0,其中語言稱為Oak,但是SoftwareEngineering.SE中的一個是指第一個穩定版本,JDK 1.0.2稱為Java 1.0,它被刪除了。

現在,如果您嘗試在Java 1.0文檔中搜索它,您將無法找到它,因為如前所述,它已在JDK 1.0.2中刪除,也稱為Java 1.0。 當您查看所發布鏈接的“上次修改時間”時,會再次證明這一點。 您發布的鏈接最后一次修改於1996年2月。當private protected被刪除后,Java 1.0 / JDK 1.0.2在1996年2月之后發布,並根據規范,1996年8月發布。

移除原因

一些消息來源也解釋了private protected的原因,例如這個 報價:

什么是私人保護?

早期,Java語言允許某些修飾符組合,其中一個是private protected private protected的含義是嚴格限制子類的可見性(並刪除包訪問)。 后來認為這有點不一致和過於復雜,不再受支持。[5]

[5] protected修飾符的含義在Java的Beta2版本中發生了變化,並且private protected組合同時出現。 他們修補了一些潛在的安全漏洞,但讓很多人感到困惑。

SoftwareEngineering.SE也支持這一點,它表示不值得出現不一致和額外的復雜性,因此它很早就被刪除了。

解釋

我對這一切的解釋是,也許,在橡樹時代,兩者都被允許共存(因此組合)。 由於protected的含義已經改變1 ,因此可能需要同時允許privateprotected 介紹變得過於復雜,不值得,因此最終被刪除了。 當Java 1.0 / JDK 1.0.2推出時,它已被刪除,因此無法在文檔中找到。


1Oak語言規范的第4.10節“ 訪問變量和方法”中 ,注意到默認修飾符受到protected

默認情況下,類中的所有變量和方法都受到保護

這與我們今天的默認包訪問完全不同。 這可能為private protected的需要鋪平了道路,因為private過於嚴格, protected太寬松。

有令人困惑/不清楚的故事:

其中一個來自普林斯頓來源,也來自麻省理工學院檔案館 ,其中指出:

注意:Java語言的1.0版本支持五種訪問級別:上面列出的四種加上私有保護。 在高於1.0的Java版本中不支持私有受保護的訪問級別; 你不應該再在Java程序中使用它了。

但是此處此處未在Java 1.0的任何官方文檔中指定此功能。

我的猜測是,這個功能沒有達到官方的1.0版本,因為官方語言規范是從1996年8月開始的,普林斯頓源是在1996年2月修改的。

PS:對Oracle刪除舊版本的存檔感到羞恥。

由於您在問題中提供的鏈接建議在類的element/member上使用private protected ,當您希望subclass能夠訪問該元素但將其隱藏在其package其他類時。

Java ,如果相比於C++具有封裝元素的一個額外的概念-這是一個 當涉及到privatepublicprotected等訪問說明符時,人們還應該了解Java包內外可訪問的內容。

請注意,我已經解釋了為什么使用它。 當然不是當前版本

不,你不能同時使用private protected 你的教程很奇怪。 你所擁有的是所謂的包私有或在ot6引用包受保護的訪問。 這是在未明確寫入acc6限定符時啟用的默認訪問。

私有范圍與現有類相關。 其中受保護的可以在包內進行訪問,類可以通過其他包中的類進行擴展。

如果您希望您的變量/方法在包外部訪問,則無縫地需要將其定義為protected / public,否則為private或其他訪問說明符。

受保護的方法通常可以從外部包和子類中訪問,即類必須擴展相應的類以利用受保護的定義方法。

私有方法/變量在類中具有范圍。它們不能在課堂外訪問。

因此,您無法同時定義Private Protected!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM