簡體   English   中英

私人會員可通過公共方式訪問

[英]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.

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