一文搞清楚Java中的方法、常量、變數、引數

可可西里發表於2024-01-22

Java中的變數與常量

在JVM的運轉中,承載的是資料,而資料的一種變現形式就是“量”,量分為: 常量與變數,我們在數學和物理學中已經接觸過變數的概念了,在Java中的變數就是在程式執行過程中可以改變其值的量。

常量

與變數相對應的是常量,所謂常量,即在作用域內保持不變的值,一般用final關鍵字進行修飾,通常分為全域性常量、類內常量、區域性常量。
【程式用例】

public class Person {    //全域性常量
    public static final String SEX = "男";    //類內常量
    private static final String BIRTHPLACE ="安徽";    public void method1(String str){        //區域性常量-方法常量
        final String LANGUAGE = "漢語";
    }    
    public void method2(final int age){        //區域性常量-引數常量,不可改,這段程式碼會編譯報錯
        age = 20;
    }
}

變數

變數同樣分為區域性變數、成員變數和靜態變數
【程式用例】

public class Person {    //成員變數
    //在類內部但在方法體外宣告的變數稱為成員變數,或者例項變數,或者欄位。
    //之所以稱為例項變數,是因為該變數只能透過類的例項(物件)來訪問。
    int data1 = 3;    //靜態變數
    //透過 static 關鍵字宣告的變數被稱為靜態變數(類變數),
    //它可以直接被類訪問
    static int data2 = 4;    public int sum(){        //區域性變數
        //在方法體內宣告的變數被稱為區域性變數,該變數只能在該方法內使用,
        //類中的其他方法並不知道該變數。
        int a = 1;        int b = 2;        return a+b;
    }    public static void main(String[] args) {        Person person = new Person();
        System.out.println(person.data1 == person.sum());
        System.out.println(Person.data2 == person.sum());
    }
}

【變數使用時注意事項】

區域性變數
區域性變數宣告在方法、構造方法或者語句塊中。
區域性變數在方法、構造方法、或者語句塊被執行的時候建立,當它們執行完成後,將會被銷燬。
訪問修飾符不能用於區域性變數。
區域性變數只在宣告它的方法、構造方法或者語句塊中可見。
區域性變數是在棧上分配的。
區域性變數沒有預設值,所以區域性變數被宣告後,必須經過初始化,才可以使用。

成員變數
成員變數宣告在一個類中,但在方法、構造方法和語句塊之外。 當一個物件被例項化之後,每個成員變數的值就跟著確定。
成員變數在物件建立的時候建立,在物件被銷燬的時候銷燬。
成員變數的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠透過這些方式獲取例項變數資訊。 成員變數可以宣告在使用前或者使用後。
訪問修飾符可以修飾成員變數。
成員變數對於類中的方法、構造方法或者語句塊是可見的。一般情況下應該把成員變數設為私有。透過使用訪問修飾符可以使成員變數對子類可見;成員變數具有預設值。數值型變數的預設值是
0,布林型變數的預設值是 false,引用型別變數的預設值是 null。變數的值可以在宣告時指定,也可以在構造方法中指定。

靜態變數
靜態變數在類中以 static 關鍵字宣告,須在方法、構造方法和語句塊之外。
無論一個類建立了多少個物件,類只擁有靜態變數的一份複製。 靜態變數除了被宣告為常量外很少使用。 靜態變數儲存在靜態儲存區。
靜態變數在程式開始時建立,在程式結束時銷燬。 與成員變數具有相似的可見性。但為了對類的使用者可見,大多數靜態變數宣告為 public 型別。
靜態變數的預設值和例項變數相似。 靜態變數還可以在靜態語句塊中初始化

Java中的方法

何為方法?我的理解是:方法是Java中對邏輯行為的一種程式實現,透過方法的呼叫去實現我們想讓物件所擁有的行為,比如一個物件的增刪改查,只需要建立相應的方法即可!

方法的宣告

在方法宣告中,最重要的就是方法名(採用小駝峰命名法)與引數,這兩者構成的方法的簽名,是方法過載的判斷依舊,除此之外,在宣告方法的時候,還會設定訪問許可權、是否靜態、返回值型別等。結構如下圖:

例項方法

在類中宣告,無需static、abstract等關鍵字修飾,建立類物件,透過物件的引用所呼叫的方法為例項方法,類中最為常見的一種方法型別。上程式碼!

public class Test {    public static void main(String[] args) {        Test sum = new Test();
        System.out.println(sum.add(1,2));
    }    //例項方法,求兩數之和
    public int add(int a, int b) {        return a + b;
    }
}

靜態方法

若方法的宣告中加上了static關鍵字,靜態方法是屬於類的,而不是屬於類建立的物件或例項的,故在呼叫時無需透過物件例項。

public class Test {    public static void main(String[] args) {
        System.out.println(sub(2,1));
    }    public static int sub(int a,int b){        return a - b;
    }
}

【注意事項】

1、靜態方法只能訪問靜態成員2、呼叫靜態方法時可能物件並沒有被初始化,此時非靜態變數還未初始化3、非靜態方法的呼叫和非靜態成員變數的訪問要先建立物件

抽象方法

當一個方法被關鍵字abstract修飾後,且沒有方法體,那它就成為了一個抽象方法,抽象方法往往出現在抽象類和介面中。

/**
 * @author JavaBUild
 */abstract class AbstractDemo {    abstract void display();
}

【注意事項】

1、抽象類中不一定必須要有抽象方法,但是有抽象方法的類必須是抽象類
2、若一個類繼承了抽象類,則必須實現抽象類中的抽象方法!
3、抽象類不能被例項化
4、抽象方法不能被宣告為靜態
5、抽象方法不能用 private 修飾
6、抽象方法不能用 final 修飾

native方法

我們在講Java的Object類時,已經接觸過Java中的native方法了,它們用native關鍵字修飾,用C/C++語言實現,宣告時native關鍵字必須在返回值前,不能用abstract修飾、沒有方法體,甚至沒有大括號!

public final native Class<?> getClass();public native int hashCode();protected native Object clone() throws CloneNotSupportedException;

這類方法存在的意義是作為Java標準類庫的一種擴充套件,或者相容其他語言寫好的且更好用的類庫,或者提升程式執行效率。

構造方法

除了以上那些方法外,Java中還有一種特殊的方法,名為構造方法,用以在物件初始化工作,Java 有兩種型別的構造方法:無參構造方法和有參構造方法。
當我們在一個類中不寫任何構造方法時,編譯器會預設一個無參構造方法,只不過這個方法是預設的,顯示不可見。
構造方法的宣告規範

構造方法的名字必須和類名一樣;
構造方法沒有返回型別,包括 void;
構造方法不能是抽象的(abstract)、靜態的(static)、最終的(final)、同步的(synchronized)。

程式碼示例

public class Test {   private String name;   private int age;    //預設構造方法,無參構造
    public Test() {
    }    //有參構造方法
    public Test(String name, int age) {        this.name = name;        this.age = age;
    }    public static void main(String[] args) {        //透過無參構造建立的物件,會有預設值
        Test test1 = new Test();        //透過有參構造方法構造的物件,在初始化時便進行了賦值
        Test test2 = new Test("JavaBuild", 18);
        System.out.println(test1.name+":"+test1.age);
        System.out.println(test2.name+":"+test2.age);
    }
}

輸出:

null:0JavaBuild:18

Java中引數

上面構造方法中提及了有參構造和無參構造,那麼現在就好好聊一聊這個引數,引數應用於方法之中,作為方法運轉的條件和參考,當然這僅限於有引數的方法,方法中的引數分形參和實參,形參是在方法的定義階段,而實參則是在方法的呼叫階段,引數個數不限,型別不限,可以是基本資料型別,也可以是引用型別。

可變引數
在jdk5中為了解決反射機制和printf中的問題引入了可變引數概念,顧名思義就是引數個數不確定的場景。定義方式:"引數型別...";

程式碼示例

public class Test {    public static void main(String[] args) {
      countLength("a");
      countLength("a","b");
      countLength("a","b","c");
    }    public static void countLength(String... args){
        System.out.println(args.length);
    }
}

【注意事項】

1、每個方法最多隻有一個可變引數
2、可變引數必須是方法的最後一個引數
3、無法僅透過改變可變引數的型別,來過載方法
4、透過對 class 檔案反編譯可以發現,可變引數被編譯器處理成了陣列


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70036623/viewspace-3004685/,如需轉載,請註明出處,否則將追究法律責任。