1. 程式人生 > 其它 >JAVA學習過程記錄(四)

JAVA學習過程記錄(四)

一:面向物件

Q:什麼是面向物件的開發方式?

A:採用面向物件的開發方式更符合人類的思維方式,人類就是以“物件”來認識世界的。所以面向物件更容易讓人接受。面向物件就是將現實世界分割成不同的單元,然後每一個單元都實現成物件,然後驅動一下

讓各個物件直接協作起來形成一個系統。

當我們採用面向物件的方式貫穿整個系統的時候,涉及到3個術語。

OOA:面向物件分析

OOD:面向物件設計

OOP:面向物件程式設計

實現一個軟體的過程:

分析(A)→設計 (D)→ 程式設計(P)

面向物件有三大特徵:封裝,繼承,多型3


1.類和物件的概念:

什麼是類:

類其實在現實生活中是不存在的,是一個抽象的概念,是一個模板。例如西瓜,蘋果都屬於水果類

什麼是物件:

物件是實際存在的個體

例如西瓜是一個物件,蘋果也是一個物件。

 

在JAVA語言中,要想得到”物件“,必須先定義”類“,”物件“是通過”類“這個模板創造出來的。

類是一個模板:類中描述的是所有物件的”共同特徵資訊“

物件就是通過類創建出來的個體

物件還有一個名字叫做例項。

例項化:通過類這個模板建立物件的過程叫做:例項化

抽象:多個物件具有共同特徵,進行思考總結抽取共同特徵的過程。

類=屬性+方法

屬性來源於狀態,方法來源於動作。

 

2.類的定義:

怎麼定義一個類?語法格式是什麼?

[修飾符列表]class 類名 {

  類體 = 屬性+方法

  屬性在以上程式碼上以”變數“的形式存在(描述狀態)

  方法描述動作/行為

}

ps:修飾符列表可以省略

 

Q:為什麼屬性是以變數的形式存在的?

A:假設我們要描述一個學生:學生包括哪些屬性——

  學號:12345

  姓名:小熊冰淇淋

  地址:北京市海淀區

  性別:男(ture/false)

答案:是因為屬性對應的是”資料“,資料在程式中只能放到變數中

結論:屬性其實就是變數。

 

3.建立物件的語法:

new 類名();

類是模板,通過一個類,是可以創建出N個物件的。

new是一個運算子。專門負責物件的建立。

型別 變數名 = new 類名();

 

4.什麼是例項變數

物件被稱為例項。

例項變數實際上就是:物件級別的變數。

public class 明星類{

  double height;

}

身高這個屬性所有的明星物件都有,但是每一個物件都有自己的身高值

假設建立10個明星物件,height變數應該有十份。

所以這種變數被稱為物件級別的變數。屬於例項變數。

 

5.類的使用格式(筆者總是在這裡蒙圈,所以這部分內容極其重要)

出處:https://www.cnblogs.com/time-to-despair/p/9700205.html

public class Test {
    public static void main(String[] args) {
        //定義了一個Phone型別的變數p
        Phone p = new Phone();
        /*
         * 通過p,使用Phone中的屬性
         */
        //訪問p中的brand品牌屬性
p.brand = "蘋果6s";[為p中brand屬性賦值為”蘋果6s”]
//訪問p中的color顏色屬性
        p.color = "白色";[為p中color屬性賦值為”白色”]
//訪問p中的size尺寸大小屬性
p.size = 5.5;[為p中size屬性賦值為5.5]

System.out.println("手機品牌為" + p.brand[使用p中brand屬性值參與運算]);
System.out.println("手機顏色為" + p.color[使用p中color屬性值參與運算]);
System.out.println("手機尺寸大小為" + p.size[使用p中size屬性值參與運算]);
    }
}

 

p.brand的意思實際上是p物件的breand屬性,同理p.size實際上是p物件的color屬性。

成員變數中的例項變數,必須先建立物件,通過引用.來訪問

凡是通過new運算子建立的物件,都儲存在堆記憶體中。new運算子的作用就是在堆記憶體中開闢了一條空間。

像這種p變數,儲存了記憶體地址的變數,有一個特殊的名字——引用。

如上圖所示,new運算子在堆記憶體開闢了一條空間,然後將記憶體地址賦值給變數p

 

6.空指標異常

如果一個物件沒有“引用”指向它時,java規定堆記憶體程式設計師是沒有權力去進行操控的。所以此時這個物件就失效了,等待垃圾回收器的回收,GC會將這個垃圾物件釋放掉。

而出現空指標的現象的原理是“空引用”訪問例項【物件】相關的資料,會出現空指標異常。

 

7.方法呼叫時的引數傳遞

JAVA中規定:引數傳遞的時候,和型別無關,不管是基本資料型別還是引用資料型別。統一都是將盒子裡的那部分值複製一份,然後傳遞下去。

int x=100;
int y=x;

實際上是把x中儲存的100複製了一份給y,x和y是兩個區域性變數。

 

8.構造方法

Q:什麼是構造方法?有什麼用?

A:構造方法是一個特殊的方法,通過構造方法可以來完成物件的建立,以及例項變數的初始化。換句話說:構造方法是用來建立物件,並且同時給物件的屬性賦值。(例項變數沒有手動賦值的時候,系統會賦預設值)

 

當一個類沒有提供任何構造方法,系統會預設提供一個無引數的構造方法,這個構造方法北稱為預設構造器。

 

Q:構造方法如何呼叫呢?

A:使用new運算子來呼叫構造方法。

 

構造方法的語法是:

[修飾符列表] 構造方法名 (形式引數列表){

  構造方法體;

}

普通方法的語法是:

[修飾符列表]  返回值型別 方法名 (形式引數列表){

  方法體;

}

 

注意:修飾符列表不能寫static,且構造方法名和類名必須一致。構造方法不需要指定返回值型別,也不能寫void,寫上void就表示為普通方法了,就不是構造方法了。

 

如果一個類沒有定義任何構造方法,但是系統實際上會給這個類提供一個無引數的構造方法。

我們知道例項變數沒有手動賦值的時候,實際上系統會賦預設值,那麼這個預設值的賦值操作是在什麼時候進行的?是在類載入的時候給這些例項變數賦值嗎?

其實不然,例項變數是在構造方法執行的過程中完成初始化的,完成賦值的。

如果手動定義了有參方法,那麼無參方法會消失,如果沒定義有參方法和無參方法,那麼系統會自動定義一個無參方法。

 

9.封裝

面向物件三大特徵:

封裝

繼承

多型

有了封裝,才有繼承,有了繼承,才有多型。

 

Q:什麼是封裝?封裝有什麼用?

A:封裝的作用有兩個。一是保證內部結構的安全,二是遮蔽複雜,暴露簡單。

 

在程式碼級別上封裝的意義在於可以讓程式碼的呼叫人員不用關心程式碼內部的複雜實現。只需要通過一個簡單的入口就可以隨意訪問了。

另外,類體中安全級別較高的資料封裝起來,外部人員就不能隨意訪問了,可以提高程式碼的安全性。

 

Q:怎麼進行封裝?程式碼怎麼實現?

A:私有化成員變數,使用private關鍵字修飾,並且提供公有的get和set方法,在方法體中進行合理值的判斷,使用public關鍵字修飾;

對外提供簡單的訪問入口,外部程式只有呼叫以下的程式碼來完成訪問。

例如寫一個方法專門用來完成讀(get)

  寫一個方法專門用來完成寫(set)

並且不帶static

注意:JAVA開發規範中有要求,set和get方法要滿足如下格式。

  get方法的要求:

    public 返回值型別 get+屬性名首字母大寫(無參){

      return xxx;

    }

  set方法的要求:

    public void set+屬性名首字母大寫(有1個引數){

      xxx=引數;

    }

程式應該儘量按照JAVA規範來提供set和get方法,如果不按照這個規範來,那麼你的程式將不是一個通用的程式。

 

 

ps:帶有static的方法怎麼呼叫?通過"類名."的方式訪問(如果在同一個類中,類名可以省略)

如果一個方法不帶有static,這樣的方法稱為例項方法(物件方法,物件級別的方法)

例項變數都是物件變數,例項方法是物件方法。

例項相關的都需要 new 物件,通過“引用.”的方式去訪問。

 

10.static關鍵字

static翻譯為靜態,所有static關鍵字修飾的都是類相關的,類級別的。所有static修飾的,都是採用"類名."的方式訪問。

static修飾的變數:靜態變數

static修飾的方法:靜態方法

變數的分類:

  變數根據宣告的位置進行劃分:

    在方法體當中宣告的變數叫做:區域性變數

    在方法體當中宣告的變數叫做:成員變數

 

    成員變數又可以分為:

      例項變數

      靜態變數

class vartest{

  //以下例項的,都是物件相關的,訪問時採用"引用."的方法訪問。需要先new物件 。

     //例項相關的,必須先有物件,才能訪問,可能會出現空指標異常
  //成員變數中的例項變數
  int i;



  //例項方法

  public void m2(){

 

  }

 

  //以下靜態的,都是類相關的,訪問時採用“類名.”的方式訪問。不需要new物件。

  //不需要物件的參與即可訪問。沒有空指標異常的發生

  //成員變數中的靜態變數

  static int k;

 

  public static void m1(){

 

  }

}

 

 

靜態變數在類載入時初始化,不需要new物件,靜態變數的空間就已經開闢出來了。

靜態變數儲存在方法區。

記憶體圖如上:

來源https://www.bilibili.com/video/BV1Rx411876f?p=412

Q:什麼時候變數宣告為例項的,什麼時候宣告為靜態的?

A:如果這個型別的所有物件的某個屬性值都是一樣的,不建議設定為例項變數,浪費記憶體空間。建議定義為類級別特徵,定義為靜態變數,在方法區中只保留一份,節省記憶體開銷

 

例項的:一定需要使用“引用.”來訪問。

靜態的:建議使用“類名.”來訪問,但使用“引用.”也行(不建議使用引用.)

因為會造成誤會,會讓其他程式設計師認為是例項的。

 

結論:

  空指標異常只有在什麼時候才會發生呢?

    只有在“空引用”訪問"例項"相關的,都會出現空指標異常。

 

11.靜態程式碼塊

使用static關鍵字可以定義靜態程式碼塊

Q:什麼是靜態程式碼塊?語法是什麼?

A:static{

    JAVA語句;

    JAVA語句;

}

 

Q:static靜態程式碼塊在什麼時候執行呢?

A:類載入時執行,並且只執行一次

 

注意:靜態程式碼塊在類載入時執行,並且在main方法執行前執行。