Java中的構造方法總結
阿新 • • 發佈:2019-02-02
構造方法和例項方法的區別
2、返回型別是非常重要的,例項方法可以返回任何型別的值或者是無返回值(void),而構造方法是沒有返回型別的,void也不行。
3、至於命名就是構造方法與類名相同,當然了例項方法也可以與類名相同,但是習慣上我們為例項方法命名的時候通常是小寫的,另一方面也是與構造方法區分開。
而構造方法與類名相同,所以首字母一般大寫。
下面看幾個例子熟悉一下:
三、例項方法和構造方法中this、super的使用. "this"的用法 例項方法中可以使用this關鍵字,它指向正在執行方法的類的例項物件,當然static方法中是不可以使用this物件的,因為靜態方法不屬於類的例項物件;而構造方法中同樣可以使用this關鍵字,構造器中的this是指向同一個物件中不同引數的另一個構造器。讓我們來看下面的一段程式碼:
需要注意的兩個地方是: 1、構造方法中通過this關鍵字呼叫其他構造方法時,那麼這句程式碼必須放在第一行,否則會編譯錯誤。 2、構造方法中只能通過this呼叫一次其他的構造方法。 "super"的用法: 例項方法和構造方法中的super關鍵字都用於去指向父類,例項方法中的super關鍵字是去呼叫父類當中的某個方法,看下面的程式碼:
類的繼承機制使得子類可以呼叫父類的功能,下面介紹類在繼承關係的初始化順序問題 請看例項1:
SubClass constructor 程式碼中我們只例項化子類一個物件,但從執行結果上看程式一開始並不是執行子類的構造方法,而是先執行父類的預設構造方法,然後再執行子類的構造方法.所以我們在例項化子類物件時,程式會先呼叫父類的預設構造方法,然後再執行子類的構造方法。 再看例項2:
Sub with a string. 第二種方法即使父類中有顯示的預設構造方法也不會被呼叫。 再看例項三:
one-1
one-2
one-3 two 我們在main方法中例項了一個Two的物件,但是程式在例項Two物件時並沒有先呼叫Two的構造方法,而是先初始化Two類的成員變數,Two類中有三個成員變數,他們都是One類的物件,所以要依次執行One類的構造方法,然後再初始化Two類的物件。 在例項化類的物件時,類中的成員變數會首先進行初始化,如果其中的成員變數有物件,那麼它們也會按照順序執行初始化工作。在所有類成員初始化完成後,才呼叫物件所在類的構造方法建立物件。構造方法作用就是初始化。 再看例項四:
一、主要的區別在於三個方面:修飾符、返回值、命名
1、和例項方法一樣,構造器可以有任何訪問的修飾符,public、private、protected或者沒有修飾符 ,都可以對構造方法進行修飾。不同於例項方法的是構造方法不能有任何非訪問性質的修飾符修飾,例如static、final、synchronized、abstract等都不能修飾構造方法。 解釋:構造方法用於初始化一個例項物件,所以static修飾是沒有任何意義的;多個執行緒不會同時建立記憶體地址相同的同一個物件,所以synchronized修飾沒有意義; 構造方法不能被子類繼承,所以final和abstract修飾沒有意義。- publicclass Sample {
- privateint x;
- public Sample() { // 不帶引數的構造方法
- this(1);
- }
-
public Sample(int
- this.x=x;
- }
- publicint Sample(int x) { //不是構造方法
- return x++;
- }
- }
- publicclass Mystery {
- private String s;
- publicvoid Mystery() { //不是構造方法
- s = "constructor";
- }
- void go() {
-
System.out.println(s);
- }
- publicstaticvoid main(String[] args) {
- Mystery m = new Mystery();
- m.go();
- }
- }
- public class Sample1{}
- public class Sample2{
- public Sample2(int a){System.out.println("My Constructor");}
- }
- public class Sample3{
- public Sample3(){System.out.println("My Default Constructor");}
- }
三、例項方法和構造方法中this、super的使用. "this"的用法 例項方法中可以使用this關鍵字,它指向正在執行方法的類的例項物件,當然static方法中是不可以使用this物件的,因為靜態方法不屬於類的例項物件;而構造方法中同樣可以使用this關鍵字,構造器中的this是指向同一個物件中不同引數的另一個構造器。讓我們來看下面的一段程式碼:
- publicclass Platypus {
- String name;
- Platypus(String input) {
- name = input;
- }
- Platypus() {
- this("John/Mary Doe");
- }
- publicstaticvoid main(String args[]) {
- Platypus p1 = new Platypus("digger");
- Platypus p2 = new Platypus();
- System.out.println(p1.name + "----" + p2.name);
- }
- }
需要注意的兩個地方是: 1、構造方法中通過this關鍵字呼叫其他構造方法時,那麼這句程式碼必須放在第一行,否則會編譯錯誤。 2、構造方法中只能通過this呼叫一次其他的構造方法。 "super"的用法: 例項方法和構造方法中的super關鍵字都用於去指向父類,例項方法中的super關鍵字是去呼叫父類當中的某個方法,看下面的程式碼:
- class getBirthInfo {
- void getBirthInfo() {
- System.out.println("born alive.");
- }
- }
- class Platypus1 extends getBirthInfo
- {
- void getBirthInfo() {
- System.out.println("hatch from eggs");
- System.out.println("a mammal normally is ");
- super.getBirthInfo();
- }
- }
- public class test1 {
- public static void main(String[] args) {
- Platypus1 p1=new Platypus1();
- p1.getBirthInfo();
- }
- }
- class getBirthInfo {
- getBirthInfo(){
- System.out.println("auto");
- }
- void aa() {
- System.out.println("born alive.");
- }
- }
- class Platypus1 extends getBirthInfo
- {
- Platypus1() {
- super();
- System.out.println("hatch from eggs");
- System.out.println("a mammal normally is ");
- }
- }
- publicclass test1 {
- publicstaticvoid main(String[] args) {
- Platypus1 p1=new Platypus1();
- }
- }
類的繼承機制使得子類可以呼叫父類的功能,下面介紹類在繼承關係的初始化順序問題 請看例項1:
- class SuperClass
- {
- SuperClass()
- {
- System.out.println("SuperClass constructor");
- }
- }
- publicclass SubClass extends SuperClass {
- SubClass()
- {
- System.out.println("SubClass constructor");
- }
- publicstaticvoid main(String[] args) {
- SubClass sub = new SubClass();
- }
- }
SubClass constructor 程式碼中我們只例項化子類一個物件,但從執行結果上看程式一開始並不是執行子類的構造方法,而是先執行父類的預設構造方法,然後再執行子類的構造方法.所以我們在例項化子類物件時,程式會先呼叫父類的預設構造方法,然後再執行子類的構造方法。 再看例項2:
- class SuperClass
- {
- SuperClass(String str)
- {
- System.out.println("Super with a string.");
- }
- }
- publicclass SubClass extends SuperClass
- {
- SubClass(String str)
- {
- System.out.println("Sub with a string.");
- }
- publicstaticvoid main(String[] args)
- {
- SubClass sub = new SubClass("sub");
- }
- }
Sub with a string. 第二種方法即使父類中有顯示的預設構造方法也不會被呼叫。 再看例項三:
- class One
- {
- One(String str)
- {
- System.out.println(str);
- }
- }
- class Two
- {
- One one_1 = new One("one-1");
- One one_2 = new One("one-2");
- One one_3 = new One("one-3");
- Two(String str)
- {
- System.out.println(str);
- }
- }
- publicclass Test
- {
- publicstaticvoid main(String[] args)
- {
- System.out.println("Test main() start");
- Two two = new Two("two");
- }
- }
one-1
one-2
one-3 two 我們在main方法中例項了一個Two的物件,但是程式在例項Two物件時並沒有先呼叫Two的構造方法,而是先初始化Two類的成員變數,Two類中有三個成員變數,他們都是One類的物件,所以要依次執行One類的構造方法,然後再初始化Two類的物件。 在例項化類的物件時,類中的成員變數會首先進行初始化,如果其中的成員變數有物件,那麼它們也會按照順序執行初始化工作。在所有類成員初始化完成後,才呼叫物件所在類的構造方法建立物件。構造方法作用就是初始化。 再看例項四:
- class One
- {
- One(String str)
- {
- System.out.println(str);
- }
- }
- class Two
- {
- One one_1 = new One("one-1");
- One one_2 = new One("one-2");
- static One one_3 = new One("one-3");
- Two(String str)
- {
- System.out.println(str);
- }
- }
- publicclass Test
- {
- publicstatic<