[英]private member accessible via public method
private修飾符指定只能在自己的類中訪問該成員。 但我能夠使用從基類繼承的公共方法來訪問它。 有人能解釋一下為什么嗎? 這是否意味着Child類的對象包含一個名為b的成員?
這是代碼:
package a;
public class Base {
private int b;
public int getB() {
return b;
}
public void exposeB() {
System.out.println(getB());
}
public Base(int b) {
this.b = b;
}
}
package b;
public class Child extends Base {
Child(int b) {
super(b);
}
public static void main(String args[]) {
Child b = new Child(2);
// Prints 2
System.out.println("Accessing private base variable" + b.getB());
}
}
您沒有直接訪問超類中的私有變量。 您正在實施Encapsulation的概念。 您正在使用公共getter方法(在本例中為getB())來使您的私有數據被其他類加入。 因此,你可以通過公共的getter訪問私有變量b但你永遠不斜面直接訪問B於從另一個/子其instace
在類Base
,字段b
是私有的,但getB()
是公共的,所以任何人都可以調用該方法。
您可以期望編譯失敗的原因如下:
System.out.println( "Accessing private base variable" + b.b );
(除非從Base
本身的方法中調用該行)。
您將無法直接在Child
訪問b
,因為它是private
。 但是,您可以使用基類的getB
方法,該方法是public
(因此可以在任何地方調用)。
要僅允許擴展包中的類和其他類來訪問該字段,可以將其聲明為protected
。
class A {
private int n;
public A(int n) { this.n = n; }
public int n() { return n; }
}
class B extends A {
public B(int n) { super(n); }
public void print() { System.out.println(n); } // oops! n is private
}
class A {
protected int n;
public A(int n) { this.n = n; }
public int n() { return n; }
}
class B extends A {
public B(int n) { super(n); }
public void print() { System.out.println(n); } // ok
}
私有修飾符意味着您無法在類外引用該字段。 但是,因為getB()是公共的,所以您可以引用該方法。 getB()方法可以引用私有b字段,因為它在類中,因此可以訪問它。
私有變量意味着您無法直接從其類中訪問變量....聲明變量private是意味着您無法執行此操作
Myclass.myprivatevariable = 3
這將拋出一個編譯錯誤,抱怨myprivate變量從外面看不到
但是,正如你所做的那樣....將內部方法聲明為getter或setter,public,你只允許用戶通過該方法間接訪問該變量......這始終是首選的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.