日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

5、this调用语句必须是构造函数中的第一个可执行语句_Java 构造函数

發布時間:2024/10/12 java 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5、this调用语句必须是构造函数中的第一个可执行语句_Java 构造函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、構造函數是用來干什么的

構造函數是用來初始化對象的成員屬性的。

舉個例子:

public class MyClass {private String name;private int id;public MyClass(String name, int id){this.name = name;this.id = id;} }

在main方法里new一個MyClass對象的過程如下:

public class Main {public static void main(String[] args) {String name = "Jerry";int id = 1;MyClass myClass = new MyClass(name, id);} }
  • 通過new關鍵字創建一個MyClass對象,并在堆區為這個新創建的對象分配內存空間;
  • 調用MyClass類的構造函數為這個新創建的對象初始化其成員屬性name和id;
  • 聲明一個指向MyClass類型的對象引用myClass,令其指向1中新創建的對象(即myClass變量的值為1中新創建對象的內存地址)。
  • 注意一個對象建立的過程中,構造函數僅執行一次,后面想對對象的成員做改變等操作可以調用getter/setter方法。

    2、構造函數特點

    構造函數也是類里的一個函數,跟普通函數不同,構造函數主要有以下幾個特點:

    • 構造函數的名稱必須與類名相同,區分大小寫;
    • 構造函數沒有返回值,也不能用void修飾;
    • 構造函數可以用任何訪問修飾符(public、protected和private)修飾;
    • 構造函數不能用static、final、abstract和synchronized等關鍵字修飾;
    • 構造函數不能被覆寫(override);
    • 構造函數可以被重載(overload),以參數的個數、類型及順序區分;
    • 重載意味著一個類里可以有多個構造函數,構造函數1可以調用構造函數2完成對象初始化,通過this關鍵字:this(參數1,參數2...)實現;
    • 接口里沒有構造函數,抽象類里可以有構造函數,也可以沒有,抽象類的構造函數在創建繼承自抽象類的子類的對象時會被調用;

    3、構造函數分類

    構造函數分為有參構造函數、無參構造函數和默認構造函數。

    3.1 有參構造函數

    帶入參的構造函數叫有參構造函數,上面例子里就是有參構造函數。

    3.2 無參構造函數

    不帶入參的構造函數叫無參構造函數。無參構造函數對類的成員初始化有下面兩種方法:

    (1)在類成員變量聲明時進行初始化

    public class MyClass {private String name = "Jerry";private int id = 1;public MyClass(){} }

    (2)在無參構造函數的方法體里對類成員變量初始化

    public class MyClass {private String name;private int id;public MyClass(){this.name = "Jerry";this.id = 1;} }

    3.3 默認構造函數

    當類里沒有顯式地定義代碼來實現任何構造函數時,Java編譯器將會在編譯的字節碼(.class文件)里面為這個類插入默認構造函數。由于是在編譯階段插入,因此在源文件(.java)里是不會找到默認構造函數的代碼的。

    默認構造函數形式上類似無參構造函數(都沒有入參),但是二者并不能劃等號,區別如下:

    • 默認構造函數方法體為空,無參構造函數方法體可以為空也可以不為空;
    • 只要類里顯式的創建了一個構造函數,比如一個無參構造函數,編譯器都不會再為這個類創建默認構造函數了。

    4、子類中調用父類的構造函數

    在Java中,子類的構造函數必須調用父類的構造函數,這個調用可以是隱式地調用,即代碼里沒有直接調用父類構造函數,但是編譯器會默認調用父類的無參構造函數或者默認構造函數;也可以顯示地通過super關鍵字調用父類的構造函數,總之一句話:子類的構造函數必須調用父類的構造函數。

    子類中調用父類的構造函數分為以下兩個場景:

    • 當父類定義了無參構造函數,或者父類源碼里沒有顯式定義構造函數而是編譯器插入了一個默認構造函數,則子類構造函數里可以不顯式地調用父類構造函數,此時編譯器會在子類的構造函數里默認調用父類的無參構造函數或者默認構造函數;
    • 當父類沒有定義無參構造函數,且定義了有參構造函數,則在子類的構造函數里必須通過super語句顯式地調用父類的有參構造函數。

    (1)對于第一個場景,且父類里包含無參構造函數,舉例如下:

    父類:

    public class Dog {private String name;public Dog(){System.out.println("調用Dog類的無參構造函數");} }

    子類:

    public class YellowDog extends Dog {private String name;public YellowDog(){System.out.println("調用YellowDog類的無參構造函數");} }

    main函數:

    public class Main {public static void main(String[] args) {Dog dog = new YellowDog();} }

    結果如下:

    調用Dog類的無參構造函數 調用YellowDog類的無參構造函數

    此時創建子類對象時,會先調用父類的無參構造函數,再調用子類的無參構造函數。

    如果把父類的無參構造函數去掉,即父類里不定義任何構造函數,此時運行結果如下:

    調用YellowDog類的無參構造函數

    此時創建子類對象時,會先調用父類的默認構造函數,再調用子類的無參構造函數。

    (2)對于第二個場景,舉例如下:

    父類:

    public class Dog {private String name;public Dog(String name){this.name= name;System.out.println("調用Dog類的有參構造函數");} }

    父類里不包含無參構造函數,僅有有參構造函數,此時子類如果不顯式地調用父類的有參構造函數會報錯,如圖:

    提示父類里沒有默認構造函數,那是因為子類里沒有顯式地調用父類構造函數,編譯器會去父類里尋找無參構造函數,無參構造函數也沒有就看能否找到默認構造函數,默認構造函數也找不到就會報上面的錯誤。

    正確的做法是在子類里通過super語句顯式地調用父類的構造函數,如下:

    子類:

    public class YellowDog extends Dog {private String name;public YellowDog(String name){super(name);System.out.println("調用YellowDog類的有參構造函數");} }

    Main函數:

    public class Main {public static void main(String[] args) {String name = "Jerry";Dog dog = new YellowDog(name);} }

    執行main函數結果如下:

    調用Dog類的有參構造函數 調用YellowDog類的有參構造函數

    此時創建子類對象時,會先調用父類的有參構造函數,再調用子類的有參構造函數。

    參考

    lea:Java中的構造函數——通過示例學習Java編程(14)?zhuanlan.zhihu.comhttps://blog.csdn.net/yuyan1988nb/article/details/78133738?blog.csdn.netJava里的構造函數(構造方法) - LivterJA - 博客園?www.cnblogs.com

    總結

    以上是生活随笔為你收集整理的5、this调用语句必须是构造函数中的第一个可执行语句_Java 构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。