jimingminlovefly

          統計

          最新評論

          Java默認構造函數的作用

          當new一個對象時,先判斷是否調用的構造函數有參數,
          如果有參數,則根據參數的個數、類型來自動調用相應
          的構造函數構造對象,分配內存,并返回對象的引用。

          “如果定義了一個帶參數的構造方法后,就一定要定義一個
          不帶參數的構造方法,否則就不能創建新對象(無參數)。”
          因為當構造一個類的對象時,編譯器首先判斷類是否有
          構造函數,如果沒有,則自動加上一個默認構造函數,
          而一旦發現有構造函數后,則不再自動加上構造函數。
          轉而認為你沒有用類的合法的構造函數而報出編譯錯誤。

          class Person
          {
          private String name="";
          private int age=0;

          public Person()
          {
             System.out.println("person無參數構造函數");
          }

          public Person(String name,int age)
          {
             this.name=name;
             this.age=age;
             System.out.println("person 2 參數的構造函數");  
          }
          }

          class Student extends Person
          {

          private String school;
          private String grade;

          public Student()
          {
             System.out.println("student 無參數的構造函數");
          }

          public Student(String name ,int age,String school)
          {
             System.out.println("student 3 參數的構造函數");
          }
              public   Student(String name ,int age,String school,String grade)
          {
             super(name,age);
             this.school=school;
             this.grade=grade;
             System.out.println("student 4 參數的構造函數,super().");
          }
          }

          class Test
          {
          public static void main(String [] args)
          {
             System.out.println("st1:");
             Student st2=new Student();
                System.out.println("---------------------------");
               
             System.out.println("st2:");
             Student st=new Student("zhangshan",76,"武大");
             System.out.println("---------------------------");
            
             System.out.println("st3:");
             Student st3=new Student("lisi",24,"武大","研究生");

          }

          /*
          =======================================
          輸出如下:

          E:JavaWork>java Test
          st1:
          person無參數構造函數
          student 無參數的構造函數
          ---------------------------
          st2:
          person無參數構造函數
          student 3 參數的構造函數
          ---------------------------
          st3:
          person 2 參數的構造函數
          student 4 參數的構造函數,super().

          **************************************

              說明了創建一個子類的對象實例的時候,必先調用父類的無參數的構造函數(默認構造函數),假如父類有帶參數的構造函數,那么系統將不會給它創建無參數的構造函數,這時,子類在實例化的時候,因為找不到父類的默認構造函數,編譯器將會報錯,但如果在子類的構造函數中指定用父類的帶參數的構造函數的時候,或者在父類中加一個無參數的構造函數,就不會報錯。

          =============================================

          我們假設A是B的父類,B是A的子類。

          1、如果程序員沒有給類A沒有提供構造函數,則編譯器會自動提供一個默認的無參數的構造函數,如果用戶提供了自己的構造函數,則編譯器就不在提供默認的無參數構造函數。

          2、子類B實例化時會自動調用父類A的默認構造函數,所以如果A的默認的無參數的構造函數為private,則編譯器會報錯,而如果A沒有提供默認的無參數的構造函數,而提供了其他類型的構造函數,編譯器同樣會報錯,因為B找不到A的默認無參數構造函數。所以,我們最好給父類A提供一個無參數的構造函數。

          3、或者在B的構造函數中顯示的調用父類A的有參構造函數。super(parameter

          posted on 2012-04-17 11:32 計明敏 閱讀(757) 評論(0)  編輯  收藏 所屬分類: j2se

          主站蜘蛛池模板: 射阳县| 易门县| 陈巴尔虎旗| 贵溪市| 石楼县| 上林县| 陕西省| 黄浦区| 新泰市| 东方市| 綦江县| 云南省| 加查县| 灯塔市| 准格尔旗| 资溪县| 杭州市| 吴桥县| 临泽县| 桃江县| 舟山市| 民和| 涪陵区| 来安县| 镇巴县| 上蔡县| 微博| 镇安县| 古交市| 清镇市| 夏邑县| 芮城县| 垦利县| 呈贡县| 彭水| 宣武区| 沙湾县| 鄂温| 苍南县| 林口县| 和龙市|