JAVA基礎-類和對象

面向對象編程

  • 萬物皆對象
  • 面向對象指以屬性和行爲的觀點去分析現實生活中的事物
  • 面向對象編程指先以面向對象的思想進行分析,而後使用面向對象的編程語言進行表達的過程
  • 理解面向對象的思想精髓(封裝, 繼承, 多態)

類和對象及引用

類和對象的概念

  • 對象主要指現實生活中客觀存在的實體, 在Java語言中對象體現爲內存空間中的一塊存儲區域
  • 類簡單來講就是「分類」, 是對具備相同特徵和行爲的多個對象共性的抽象描述. 在Java語言中體現爲一種引用數據類型, 裏面包含了描述特徵/屬性的成員變量以及描述行爲的成員方法
  • 類是用於構建對象的模板, 對象的數據結構由定義它的類來決定

類的定義

class 類名 {
    類體;
}

// 一般狀況下, 當類名由多個單詞組成時, 要求每一個單詞首字母都要大寫

成員變量的定義

class 類名 {
    數據類型 成員變量名 = 初始值;
}

// 當成員變量由多個單詞組成時,一般要求從第二個單詞起每一個單詞的首字母大寫

對象的建立

new 類名();
  • 當一個類定義完畢後, 可使用new關鍵字來建立該類的對象, 這個過程叫作類的實例化
  • 建立對象的本質就是在內存空間的堆區申請一塊存儲區域, 用於存放該對象獨有特徵信息

引用的定義

基本概念

  • 使用引用數據類型定義的變量叫作引用變量,簡稱爲「引用」
  • 引用變量主要用於<u>記錄對象在堆區中的內存地址信息</u>, 便於下次訪問

語法格式

類名 引用變量名;
引用變量名.成員變量名;
Person p = new Person();
p.name = "烏冬面";
System.out.println(p.name);

成員變量初始值

對象建立後, 其成員變量能夠按照默認的方式初始化, 具體規則以下編程

成員變量的類型 默認初始值
數值類型 byte, short ,int ,long, float, double, char 0
boolean false
引用類型 null

成員方法

成員方法的定義

class 類名{
    返回值類型 成員方法名(形參列表){
        成員方法體;
    }
}

// 當成員方法名由多個單詞組成時, 要求從第二個單詞起每一個單詞的首字母大寫

返回值類型的詳解

  • 返回值主要指從方法體內返回到方法體外的數據內容
  • 返回值類型主要指返回值的數據類型, 能夠是基本數據類型, 也能夠是引用數據類型.(好比,當返回的數據內容是66時,返回值類型寫int便可)
  • 在方法體中使用return關鍵字能夠返回具體的數據內容並結束當前方法.(好比,當返回的數據內容是66時,則方法體中寫return 66;便可)
  • 當該方法不須要返回任何數據內容時, 則返回值類型寫void便可

形參列表的詳解

  • 形式參數主要用於將方法體外的數據內容帶入到方法體內部.(好比,當帶入的數據內容是"hello"時, 則形參列表寫String s便可)
  • 形式參數列表主要指多個形式參數組成的列表,語法格式是:數據類型 形參變量名1, 數據類型 形參變量名2,....(好比, 當帶入的數據內容是66和"hello"時, 則形參列表寫int i, String s便可)
  • 若該方法不須要帶入任何數據內容時, 則形參位置啥也不寫便可

方法體的詳解

  • 成員方法體主要用於編寫描述該方法功能的語句塊
  • 成員方法能夠實現代碼的重用,簡化代碼

方法的調用

引用變量名.成員方法名(實參列表);p.show();數組

  • 實際參數列表主要用於對形式參數列表進行初始化操做, 所以參數的個數/類型/以及順序都要徹底一致
  • 實際參數能夠傳遞 直接量/變量/表達式/方法的調用 等

可變長參數

返回值類型 方法名(參數的類型...參數名)數據結構

  • 方法參數部分指定類型的參數個數是能夠改變的, 也就是0~n個
  • 一個方法的形參列表最多隻能聲明一個可變長形參,而且須要放到參數列表的末尾

方法的傳參過程

int max(int ia, int ib){...}
public static void main(String[] args){
    int a = 5;
    int b = 6;
    int res = m.max(a,b);
}
  1. 爲main方法中的變量a, b, res分配空間並初始化
  2. 調用max方法, 爲max方法的形參變量ia, ib分配空間
  3. 將實參變量的數值賦值到形參變量的內存空間中
  4. max方法運行完畢後返回, 形參變量空間釋放
  5. main方法中的res變量獲得max方法的返回值
  6. main方法結束後釋放相關變量的內存空間

image.png

參數傳遞的注意事項

  • 基本數據類型的變量做爲方法的參數傳遞時, <u>形參變量數值的改變一般不會影響到實參的數值</u> , 由於兩個變量有各自獨立的內存空間(代碼示例以下)
public class ArgumentTest{
    
    // 自定義成員方法用於打印傳入的參數
    public void show1(int ia){
        ia = 333; // 爲形參變量賦值的語句a
        System.out.println("ia = " + ia);
    }
    
    public static void main(String[] args){
        
        // 建立對象
        ArgumentTest at = new Argument();
        
        // 調用成員方法show1
        int ib = 3;
        at.show1(ib);
        System.out.println("ib = " + ib);
    }
}

/*
* 當成員方法show1()中只有打印語句,沒有其它賦值語句(語句a)時, 該程序打印結果爲:
* ia = 3     /n     ib = 3

* 當成員方法show1()中有打印語句,也有爲形參變量賦值的語句a時,該程序打印結果爲:
* ia = 333     /n     ib = 3

* 也就是實參變量ib的值沒有發生改變
*/
  • 引用數據類型的變量做爲方法的參數傳遞時, 形參變量指向內容的改變會影響到實參變量指向內容的改變. 由於兩個變量指向同一塊內存空間(代碼示例以下)
public class ArgumentTest{

    // 自定義成員方法, 用來打印傳入的參數(引用數據類型)
    pubic void show2(int[] arr){
        arr[0] = 333; // 修改形參變量數值的語句b
        System.out.println("show2方法中 arr[0] = " + arr[0]);
    }
    
    public static void main(String[] args){
    
        // 建立對象
        ArgumentTest at = new ArgumentTest();
        
        // 調用成員方法show2
        int[] arr1 = new int{11,22};
        at.show2(arr1);
        System.out.println("main方法中 arr1[0] = " + arr1[0]);
    }
}

/*
* 當成員方法中只有打印語句,沒有修改形參變量數值的語句b時,程序運行的打印結果爲:
* show2方法中 arr[0] = 11     /n   main方法中 arr1[0] = 11

* 當成員方法中不僅有打印語句,還有修改形參變量數值的語句b時,程序運行的打印結果爲:
* show2方法中 arr[0] = 333     /n   main方法中 arr1[0] = 333
* 也就是實參變量的數值由於形參變量中數值的修改而修改(下面還有內容)

* 緣由是: 對於引用數據變量, 堆區中存放變量的具體數值(在該例中即爲數組 {11,22}), 棧區中存放的是堆區的地址,也就是說存放的是指向具體數值的地址信息,而非實際的具體數值
* 因此在調用show2方法而且傳參時, 實際上傳的是數組的地址信息
* 那麼在show2方法體內對數組元素進行修改後, 實際上修改的就是實參變量所指向的同一個數組內元素的數值

* 再好比, 同窗a(實參)向同窗b(形參)要蘋果吃, 同窗b告訴a本身的蘋果放在書桌上,還有5顆,而後同窗b就走到書桌處拿蘋果.
* 此時對於兩個同窗而言, 他們面對的是同一堆蘋果(堆區). 若是同窗b將一顆蘋果換成橘子,那麼對於同窗a來講,他所擁有的就是4顆蘋果+1顆橘子
*/

image.png

  • 當引用數據類型的變量做爲方法的參數傳遞時, 若形參變量<u>改變指向後再改變指定的內容</u>, 則一般不會影響到實參變量指向內容的改變, 由於兩個變量指向不一樣的內存空間(代碼示例以下)
public class ArgumentTest{

    // 自定義成員方法實現打印參數的功能
    public void show3(int[] arr1){
        arr1 = new int[2]; //爲形參建立了新的數組c
        arr1[0] = 333;
        System.out.println("show2方法中 arr1[0] = " + arr1[0]);
    }
    
    public static void main(String[] args){
    
        // 建立對象
        ArgumentTest at = new ArgumentTest();
        
        // 調用成員方法
        int[] arr1 = new int{11,22};
        at.show3(arr1);
        System.out.println("main方法中 arr1[0] = " + arr1[0]);
    }
}

/*
* 程序運行的打印結果爲:
* show2方法中 arr1[0] = 333     /n   main方法中 arr1[0] = 11
* 此時形參中對數組元素的改變沒有影響到實參中本來的元素數值

* 這裏的緣由是
* 在show3方法體內, 爲形參在堆區申請了一塊新的內存空間,而下面語句的改變數值改變的也是這塊新的內存空間
* 而實參本來的數據就是沒有改變的
*/

image.png

內存結構之棧區

  • 棧用於存放程序運行過程中全部的局部變量. 一個運行的Java程序從開始到結束會有屢次方法的調用
  • JVM會爲每個方法的調用在棧中分配一個對應的空間, 這個空間稱爲該方法的棧幀. 一個棧幀對應一個正在調用用的方法, 棧幀中存儲了該方法的參數,局部變量等數據
  • 當某一個方法調用完成後, 其對應的棧幀將被清除

傳參的相關概念

  • 參數分爲形參實參. 定義方法時的參數叫形參, 調用方法時傳遞的參數叫實參
  • 調用方法時採用值傳遞把實參傳遞給形參, 方法內部實際上是在使用形參
  • 所謂值傳遞, 就是當參數是基本類型時, 傳遞參數的值. 好比傳遞i=10, 真實傳參時, 把10賦值給了形參. 當參數是對象是, 傳遞的是對象的值, 也就是把對象的<u>地址</u>賦值給形參

08-29 看到有人收藏了,小開心😗編程語言

相關文章
相關標籤/搜索