[Java基礎篇]對Java中的構造方法、實例方法和類方法的剖析

一、構造方法

1、什麼是構造方法?

用於創建對象並初始化對象屬性的方法,叫構造方法,也叫構造器,在類中定義,且類是一定有構造器的。

2、構造器的特點

· 構造器與類同名
· 每個類可以有一個以上的構造器
· 構造器可以重載有0、1、或多個參數
· 構造器沒有返回值
· 構造器總是伴隨着new操作一起調用,對象一建立,構造器就運行且只運行一次。一般方法可以被調用多次。
構造器之間可以相互利用(只能用this())

///構造器的格式
修飾符  類名(參數列表){
   ...
}

public class  Phone{
    String name;
    Phone (String Name){///自定義構造器,public可以忽略
       name=Name;
    }
    public static void main(String args[]){
       Phone p = new Phone("華爲");
       System.out.println(p.name);
    }
}

3、默認構造器和自定義構造器

· 默認構造器(如果類中沒有構造器,Java編譯器自動添加): 無參數,方法體是空的構造器,且默認構造器的訪問權限隨着所屬類的訪問權限變化而變化(如類的修飾符爲pubilc,則構造器的也是)。默認構造器是隱藏的。
注意: 如果類中沒有自定義的無參構造器,不能去調用無參構造器,否則會報錯。
· 自定義構造器: 自己定義(參數、方法體…)的構造器。
注意:當構造方法爲private級別時,意味着只能在當前類中訪問它。

4、關鍵字super和this的區別

(1)super和this的含義
· super: 代表父類存儲空間標識(父親的引用)
· this: 代表當前對象的引用
(2)super和this的用途
· super的用途:①引用隱式參數;(隱式參數:聲明在方法名前的,隱藏的)
②調用該類其他的構造器。
· this的用途:①調用超類(父類)的方法;
②調用超類(父類)的構造器。
(3)super和this在程序中的注意事項

super(): 調用父類的其他構造器,一定在子類調用構造器第一行使用。如果沒有就默認添加super()
this(): 是訪問當前對象,本類對象的引用,能區分實例變量和局部變量(也就是不同名),this可省略,否則不能省。

在構造器中,super(…)和this(…)不能同時出現,否則會出現初始化兩次的不安全操作,因爲super(…)和this(…)同時出現的話,在調用super(…)之後還會執行this(…),而this(…)又會自動調用super(…),這就造成了調用兩次super(…)的結果。


class Animal{

    String name;
    int age;
    Animal(String name,int age){///自定義
       this.name=name;
       this.age=age;
    }

    public void eat(){
        System.out.println("eat()!!!");
    }
}
class Cat extends Animal{
    ///如果父類沒有自定義構造器,子類是調用父類默認構造器初始化(一定調用的,無論是否子類構造是否存在)
    int Children;
    Cat(String name,int age,int Children){
      super(name,age);
      this.Children=Children;///父類沒有的功能,可以用this
      /*
      this.name=name;///已經初始化,不能再初始化了,
      this.age=age;
      */
    }
     public void eat(){
         System.out.println("貓吃魚!!!");
     }

     public void show(){
        System.out.println("此"+this.name+"活了"+this.age+"年且有"+this.Children+"個孩子");

     }
}
public class Demo {
    public static void main(String [] args){
        Cat c = new Cat("cat",2,3);///帶有變量的初始化
        c.eat();///就近原則,覆蓋父類方法
        c.show();
    }
}

this的運用(構造器之間的相互利用)

public class Animal{
    String name;
    int age;
    int child;
    public Animal(String name){
        this.name=name;
    }
    public Animal(String name,int age){///自定義
       this(name);///調用另一個重載的構造器,只能再構造器中使用
       this.age=age;
    }
    public Animal(String name,int age,int child){
        this(name,age);
        this.child=child;
    }

    public static void main(String [] args){
        ///Animal animal= new Animal();///如果沒有自定義構造器,就是調用默認構造器的初始化:null 0 0
        Animal animal= new Animal("Dog",5,10);
        System.out.println(animal.name);
        System.out.println(animal.age);
        System.out.println(animal.child);
    }
}

二、實例方法

就是可以通過類的實例(某個對象)調用的方法,也就是我們正常情況下使用的方法。實例方法也稱爲成員方法、對象方法、非靜態方法

當類的字節碼文件加載到內存中時,類的實例方法並沒有被分配入口地址,只有當該類的對象創建以後,實例方法才分配了入口地址。從而實例方法可以被類創建的所有對象調用,還有一點需要注意,當我們創建第一個類的對象時,實例方法的入口地址會完成分配,當後續在創建對象時,不會再分配新的入口地址,也可以說,該類的所有對象共享實例方法的入口地址,當該類的所有對象被銷燬,入口地址纔會消失。

實例方法的特點:
1、實例方法中可以引用實例變量,也可以引用類變量(成員變量);
2、實例方法可以調用類方法;
3、類方法中可以使用super和this的關鍵字

三、類方法

就是直接可以用類名調用的方法,也就是被關鍵字static修飾的方法,它不需要創建類的對象來調用該方法。類方法也叫靜態方法

當字節碼文件(.class)加載到內存,類方法的入口地址就會分配完成,所以類方法不僅可以被該類的對象調用,也可以直接通過類名完成調用。類方法的入口地址只有程序退出時消失。

類方法的特點:
1、用static修飾的方法;
2、類方法中不能調用類的實例方法;
3、在類方法中不能使用super、this關鍵字;
4、類方法不能被覆蓋;
5、在類方法中不能引用實例變量;

public class Main {
    public void Method(){
        System.out.println("我是實例方法!");
    }
    public static void StaticMethod(){
        System.out.println("我是類方法,也是靜態方法!");
    }
    public static void main(String [] args){
        Main m = new Main();
        m.Method();///實例方法必須有對象才能調用

        m.StaticMethod();///類方法的調用方法1:對象名.類方法名

        Main.StaticMethod();///類方法的調用方法2:類名.類方法名,一般選擇這種方法,沒有實例,如:隨機數的獲取Math.random()
    }
}

四、參考資料

1、https://www.cnblogs.com/miaoxingren/p/9366958.html
2、https://blog.csdn.net/c1776167012/article/details/102687737
3、https://blog.csdn.net/joxlin/article/details/81911330
4、https://www.jianshu.com/p/60ba478f101d
5、https://www.cnblogs.com/sunyubin/p/9751412.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章