HOWTO · Java

Java 中 private 修飾符和 public 修飾符之間的區別

本文展示了 Java 中 private 和 public 之間的區別。

本頁內容

今天,我們將通過一些示例來更好地理解兩個訪問修飾符 private 和 public 之間的顯著差異。

Java 中帶有 public 修飾符的方法

當我們在方法中使用關鍵字 public 時,其範圍擴充套件到整個程式,這意味著該方法也可以被同一專案中其他包中的任何類和函式訪問。

為了演示這個場景,我們建立了三個類。ExampleClass1 和 ExampleClass2 這兩個類在同一個名為 com.tutorial 的包中,而第三個類 ExampleClass3 在另一個名為 com.tutorial.javcaTutorial 的包中。

在 ExampleClass1 類中,我們建立了一個帶有 public 關鍵字的方法 exampleFunc(),其中包含一個 print 語句。接下來,我們通過建立一個 ExampleClass1 類物件在 ExampleClass2 類中呼叫此函式。

我們還從另一個包中的 ExampleClass3 呼叫 exampleFunc() 函式。整個程式執行沒有任何錯誤,這意味著所有這些類都可以訪問 public 方法。

package com.tutorial;

public class ExampleClass1 {
  public void exampleFunc() {
    System.out.println("exampleFunc() called");
  }
}
package com.tutorial;

public class ExampleClass2 {
  public static void main(String[] args) {
    new ExampleClass1().exampleFunc();
  }
}
package com.tutorial.javaTutorial;

import com.tutorial.ExampleClass1;

public class ExampleClass3 {
  public static void main(String[] args) {
    new ExampleClass1().exampleFunc();
  }
}

輸出:

exampleFunc() called

Java 中帶有 public 修飾符的變數

可以從程式中的任何位置訪問公共變數。如下例所示,我們可以通過建立另一個類的物件來訪問 showMsg 變數。

public class ExampleClass1 {
  public String showMsg = "This is a public variable";
}

class ExampleCLass extends ExampleClass1 {
  public static void main(String[] args) {
    System.out.println(new ExampleCLass().showMsg);
  }
}

輸出:

This is a public variable

Java 中帶有 public 修飾符的建構函式

建構函式也可以像方法和變數一樣被設為 public 和 private。如果它是 public,我們可以像在這段程式碼中那樣在任何地方建立該類的物件。

package com.tutorial;

public class ExampleClass1 {
  public String showMsg;

  public ExampleClass1() {
    showMsg = "Inside a constructor";
  }
}

class ExampleCLass extends ExampleClass1 {
  public static void main(String[] args) {
    System.out.println(new ExampleCLass().showMsg);
  }
}

輸出:

Inside a constructor

Java 中帶有 private 修飾符的方法

與 public 訪問修飾符不同,private 修飾符通過使超出範圍的類無法訪問其成員來限制其成員。

就像我們在上一節中所做的那樣,我們建立了三個類並嘗試從這兩個類中呼叫一個函式。但是我們使用了 private 修飾符而不是 public,並且在執行程式時出現錯誤。

發生這種情況是因為 private 修飾符只允許在宣告它們的類中訪問其成員。

package com.tutorial;

public class ExampleClass1 {
  private void exampleFunc() {
    System.out.println("exampleFunc() called");
  }
}
package com.tutorial;

public class ExampleClass2 {
  public static void main(String[] args) {
    new ExampleClass1().exampleFunc();
  }
}
package com.tutorial.javaTutorial;

import com.tutorial.ExampleClass1;

public class ExampleClass3 {
  public static void main(String[] args) {
    new ExampleClass1().exampleFunc();
  }
}

輸出:

java: exampleFunc() has private access in com.tutorial.ExampleClass1

Java 中帶有 private 修飾符的變數

即使變數在父類中,我們也無法從另一個類訪問私有變數。在以下示例中顯示,當從 ExampleCLass 訪問時,它會引發錯誤。

public class ExampleClass1 {
  private String showMsg = "This is a public variable";
}

class ExampleCLass extends ExampleClass1 {
  public static void main(String[] args) {
    System.out.println(new ExampleCLass().showMsg);
  }
}

輸出:

java: showMsg has private access in com.tutorial.ExampleClass1

Java 中帶有 private 修飾符的建構函式

與 private 關鍵字一起使用的建構函式會限制我們建立類的物件,因為建立物件需要建構函式。我們不能擴充套件該類,因為它的建構函式對子類不可用。

程式碼有兩個類,ExampleClass1 包含一個在類建構函式中初始化的變數。我們將此建構函式設為私有。

當我們在 ExampleCLass 中擴充套件 ExampleClass1 時,我們收到一條錯誤訊息,指出 ExampleCLass1() 具有 private 訪問許可權,因為它的建構函式是私有的。

package com.tutorial;

public class ExampleClass1 {
  public String showMsg;

  private ExampleClass1() {
    showMsg = "Inside a constructor";
  }
}

class ExampleCLass extends ExampleClass1 {
  public static void main(String[] args) {
    System.out.println(new ExampleCLass().showMsg);
  }
}

輸出:

java: ExampleClass1() has private access in com.tutorial.ExampleClass1