[英]Real example for access identifiers [public, protected, private]
我是OOP的新手。
我知道有三個標識符,它們應該在不同的情況下使用。 我還閱讀了很多關於使用“公共”標識符是否太危險的討論。 但我真的不明白為什么這很危險。
假設我有一個Windows應用程序或Web應用程序。 在那些應用程序中,我聲明了一些公共方法或變量,這有多危險? 我的意思是,我的應用程序接受用戶輸入然后產生輸出,那么它在哪些方面會有危險? 由於“公共”標識符,其他人或其他程序如何攻擊或利用或以某種方式對應用程序造成一些損害。
任何人都可以形容現實生活中的例子 謝謝。
Modifier | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public | ✔ | ✔ | ✔ | ✔
————————————+———————+—————————+——————————+———————
protected | ✔ | ✔ | ✔ | ✘
————————————+———————+—————————+——————————+———————
no modifier | ✔ | ✔ | ✘ | ✘
————————————+———————+—————————+——————————+———————
private | ✔ | ✘ | ✘ | ✘
私人的:
方法,變量和構造函數
聲明為private的方法,變量和構造函數只能在聲明的類本身中訪問。
專用訪問修飾符是限制性最強的訪問級別。 類和接口不能是私有的。
注意
如果類中存在公共getter方法,則可以在類外部訪問聲明為private的變量。 在超類中聲明受保護的變量,方法和構造函數只能由其他包中的子類或受保護成員類的包中的任何類訪問。
受保護
受保護的訪問修飾符不能應用於類和接口。
方法,字段可以聲明為protected,但是接口中的方法和字段不能聲明為protected。
注意
受保護的訪問權限使子類有機會使用輔助方法或變量,同時防止非相關類嘗試使用它。
上市
可以從任何其他類訪問聲明為public的類,方法,構造函數,接口等。
因此,可以從屬於Java Universe的任何類訪問在公共類中聲明的字段,方法,塊。
讓我們把它帶到元級別,並假裝我們是類Person
實例。
我們有一些關於我們的信息 - name
, age
, gender
, weight
, height
, hairColor
, eyeColor
等。 大多數情況下,這是我們通過偶然互動向外界揭示的信息,因此可以將其視為“公共”信息。 我的意思是,隱藏你的eyeColor
是沒有意義的,除非你真的想......
現在,有一些事情我們不告訴外面的世界,但願意告訴我們的孩子。 這些是食譜,如何解決數學問題,如何處理稅,如何處理令人討厭的分手等等。這些函數通過繼承傳遞下來,因此,只能用祖先層次結構來引用。 我們稱之為“受保護”信息,或稱為解決這些問題的“受保護”方法。
還有我們只在家庭中保留的東西,比如你的小狗咀嚼了你姐姐最喜歡的娃娃的次數,或家庭遺產的地方。 我們可以通過一些文字的思考來考慮這個問題,在我們家庭的等級制度中保密。
最后,有些事情我們不與其他任何人分享,但我們需要這些信息每天運作。 這就是我們認為的“私人”。
現在,該元例子的插圖是訪問修飾符的經典示例。
public
表示每個人都可以看到它,並用它做他們想做的事情。 也就是說,如果你有一個public
可訪問的名字,那么我可以隨心所欲,只需將其改為“Overflow Prime”,並且你無能為力。
protected
表示此字段或方法僅對直接從類繼承的人可見。 因此,例如, Child extends Parent
意味着我可以訪問Parent
的受保護方法和字段。
“package-private”,或簡稱為“no modifier”,是一個只能在包的范圍內訪問和修改的字段或方法。 這意味着就包而言,字段是public
,但對於包外的任何內容都是完全未知的。
private
是一個字段或方法, 只有該類的實例可以直接使用和操作。 即使有一個繼承鏈,如果方法或字段是私有的,那么子類也無法實現它。
現在,這對你的現實世界的例子意味着什么?
比方說,例如,您的Web應用程序處理敏感信息,如財務記錄。 如果我能夠將每周支付支票存根的類的實例從微不足道的600美元修改為可觀的79,999美元,那么我會破壞應用程序的完整性,暴露出一個重大的財務錯誤(從中發生了不好的事情) ),本來可以為我的麻煩做一個體面的每周檢查。
這就是封裝背后的想法。 我想只向外界揭示最低限度的鈎子和信息,以確保我的應用程序的完整性,並確保有人不能自己削減他們不值得的支票。
以下是您的答案: https : //softwareengineering.stackexchange.com/questions/143736/why-do-we-need-private-variables
簡而言之,從長遠來看,這是一個保持復雜性和可重用性的問題。 通過確保變量對某個類是私有的,您可以阻止其他程序員(甚至是您未來的自己)修改影響類內部的任何主要內容。
至於一個真實世界的例子,想象一下你未來的自我坐下來寫下你寫的一些代碼並試圖找出某個bug發生的位置。 經過幾天的狩獵后,您確定了罪魁禍首:修改了您班級實例的成員變量。 甚至不是你,而是你的團隊成員依靠這個變量。
現在你有一個大問題。 私有變量可以避免所有這些麻煩。
我試圖在非常基本的代碼和評論的幫助下回答這個問題。
package com.oops;
public class Modifiers {
public int a = 0;
private int b = 0;
protected int c = 0;
int d = 0;
public static void main(String[] args) {
new TestPublic().getAndPrintA();
new TestPrivate().cannotGetB();
new TestProtected().getProtected();
new TestDefault().getDefault();
}
}
class TestPublic {
public void getAndPrintA() {
Modifiers modifiers = new Modifiers();
modifiers.a = 10; // Public variables can be used from anywhere.
}
}
class TestPrivate {
public void cannotGetB() {
Modifiers modifiers = new Modifiers();
// modifiers.b; //Compile time error: The field Modifiers.b is not
// visible
}
}
class TestProtected {
public void getProtected() {
Modifiers modifiers = new Modifiers();
modifiers.c = 10; // Visible here, but will not be visible to the
// outside world.
// Protected means package and subclass
}
}
class TestDefault {
public void getDefault() {
Modifiers modifiers = new Modifiers();
modifiers.d = 10; // Visible here, but will not be visible to the
// outside world and subclass.
// Default means only within package.
}
}
雖然其他人已經很好地解釋了這些概念,但我認為問題需要一個真實的例子。 以下是嘗試解釋概念。 請注意包名: myarea
package myarea;
public class MyHome{
private int frontDoorLock;
public int myAddress;
int defaultWifiPaswd;
}
現在評論( 工作/不起作用 )解釋清楚在另一個文件但相同的包: myarea
package myarea;
public class MyBedroom{
public static void main(String[] args) {
MyHome a = new MyHome();
int v1 = a.myAddress; // works
int v2 = a.defaultWifiPaswd; // works
int v3 = a.frontDoorLock; // doesn’t work
}
}
另一個文件不同的包: neighbourArea
package neighbourArea;
import myarea.MyHome;
public class NeighbourHome{
public static void main(String[] args) {
MyHome a = new MyHome();
int v1 = a.myAddress; // works
int v2 = a.defaultWifiPwd; // doesn’t work
int v3 = a.privateVar; // doesn’t work
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.