看代碼:

public class Base {
   
    // 換成 public 也不行,由於繼承關係,仍是會調用子類baseName 未初始化
    // (初始化階段是類變量賦值,建立對象纔會賦值成員變量(賦值在構造函數執行前),因此 仍是null 
    private String baseName = "base";
   
    public Base() {
        System.out.println("Base!!!!!!!!!!!!!!!");
        callName();
    }

    public void callName() {
        System.out.println("Base  callName!!!!!!!!!!!!!!!");
        System.out.println(baseName);
    }

    static class Sub extends Base{
        private String baseName = "sub";

        public Sub(){
            System.out.println("Sub!!!!!!!!!!!!!!!");
        }

        public void callName() {
            System.out.println("Sub  callName!!!!!!!!!!!!!!!");
            System.out.println(baseName);
        }
    }

    public static void main(String[] args) {
        new Sub();
    }
}

  • new Sub();在創造派生類的過程當中首先建立基類對象,而後才能建立派生類。
  • 建立基類即默認調用Base()方法,在方法中調用callName()方法,因爲派生類中存在此方法,則被調用的callName()方法是派生類中的方法,
  • 此時派生類還未構造,因此變量baseName的值爲null

我的理解:java

  • 內部靜態類的建立,不須要外部類對象
  • 本題目特殊的地方在於內部類是外部類的子類,
    • 那麼子類初始化,須要先初始化基類,
  • 初始化基類時,子類還未建立 
    • callName 方法子類覆蓋,調用內部的baseName 是private 屬於子類,因此爲空
相關文章
相關標籤/搜索