首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 非 public 類中 public 方法的意義:接口實現與多態

     編輯:程式設計疑難解答

問題核心

類未聲明 public(包私有),其內部方法聲明 public 是否有意義?感覺與包私有方法無區別。

關鍵場景:實現公共接口

當包私有類實現 public 接口時,必須將接口方法實現為 public,否則編譯報錯。這是多態調用的基礎。

代碼示例


// 公共接口
public interface TestingInterface {
    void show();
}

// 包私有類實現接口
class N implements TestingInterface {
    @Override
    public void show() { // 必須 public
        System.out.println("這個方法可以被外部通過接口調用");
    }
}

// 外部類持有接口引用
public class TestA {
    private N n = new N(); // 內部持有具體實現

    // 對外暴露接口類型,隱藏實現細節
    public TestingInterface getN() {
        return n;
    }
}

// 客戶端代碼(不同包)
public class Client {
    public static void main(String[] args) {
        TestA testA = new TestA();
        TestingInterface ti = testA.getN(); // 獲取接口引用
        ti.show(); // 調用公共方法,實際執行 N.show()
    }
}

解析

  1. 封裝性:類 N 不對外公開,客戶端無法直接實例化,只能通過 TestA 獲取接口引用。
  2. 多態性:接口方法 public 保證客戶端可調用,運行時動態綁定到 N.show()。
  3. 編譯強制:若 N.show() 不加 public,編譯器報錯:attempting to assign weaker access privileges。

其他場景

  • 反射調用:Method.setAccessible(true) 可訪問非公共方法,但 public 方法無需特權即可調用。
  • JDK 動態代理:代理接口要求方法 public。
  • SPI 機制:服務提供者類雖非公共,但實現的接口方法必須 public。

結論

包私有類中的 public 方法並非無意義,它是實現公共契約(接口)的必要條件,支撐著面向接口編程、依賴倒置等核心設計原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved