Java中類的定義與例項化詳解
類的定義
面向物件的程式設計中,類可以看作是我們自定義的資料型別,那麼,如何能更加優美,更加高效地定義它就顯得尤為重要。
類中的成員有很多,每一部分都是十分關鍵的,畢竟“面向物件”在Java學習中真的很重要,許許多多的Java開發者定義出來的類等待著我們去使用,加油!攻克它!
直接上程式碼:
package com.my.pac02; /** * @author Summerday * @date 2019/11/26 21:40 */ //類名和檔名一致,且包含main方法 public class CatTest{ //程式入口 public static void main(String[] args) { //建立物件 Cat cat = new Cat(); //為物件的屬性賦值 cat.name = "sink"; cat.isMale = true; //通過物件呼叫方法 cat.sleep(); cat.jump(); cat.laughAt("Susan"); System.out.println(cat.isNotMale()); //列印引用變數的值 System.out.println(cat); //建立一個新的引用變數並指向原先的物件 Cat otherCat = cat; System.out.println(otherCat); System.out.println(otherCat.name);//"sink" //將cat和實際物件之間的引用消除 cat = null; } } //定義一個Cat類 class Cat{ //構造方法 Cat() { System.out.println("cat is cute."); } //成員變數 String name; int age; boolean isMale; String color = "Blue"; //方法 void sleep(){ System.out.println(name+"is sleeping---"); } public void jump() { System.out.println(name+"is jumping---"); } public void laughAt(String otherName) { System.out.println(name+"is laughing at "+otherName); } //返回boolean型別的方法 boolean isNotMale() { return !isMale; } }
定義一個簡單的類
[修飾符] class 類名
{
(零個到多個)構造器...
(零個到多個)成員變數(屬性)...
(零個到多個)方法...
}
[修飾符]修飾類時可以是上面程式碼中的public,或者final,abstract,也可以省略不寫,但不建議使用private和protected。
參考:Java的外部類為什麼不能使用private、protected進行修飾:
對於頂級類(外部類)來說,只有兩種修飾符:public和預設(default)。因為外部類的上一單元是包,所以外部類只有兩個作用域:同包,任何位置。因此,只需要兩種控制權限:包控制權限和公開訪問許可權,也就對應兩種控制修飾符:public和預設(default)。
如果類使用了private修飾符,說明是個內部類。內部類的上一級是外部類,那麼對應的有四種訪問控制修飾符:本類(private),同包(default),父子類(protected),任何位置(public)。當一個內部類使用了private修飾後,只能在該類的外部類內部使用。
上面這些都是平時使用司空見慣的,但是為什麼是這種情況呢?
可以想一下,一個java專案是不可能在一個class裡面完成的。mvc模式中,是把類分為三層,一層層呼叫類。如果定義為私有的和受保護的就無法呼叫。換句話說,對於一個java檔案,要麼就是自己單獨執行,要麼就是被其他程式作為庫呼叫,如果一個java檔案的類被private修飾,那麼是不是其他的程式或是類是無法使用它的,那麼他作為一個單獨的檔案就沒啥用了。如果它作為單個檔案執行,類載入怎麼找到它呢,因為它對外不可見。同時,也失去了類的存在意義。因此,類只有public和預設修飾符。
類名命名規範:要見名知義,意思是需要多個有意義的英文單片語成,每個單詞首字母大寫,規範這種東西,建議遵守!養成好習慣。
上面三種成員(構造器,成員變數,方法)都可以定義零個或多個,但是都是零個就變成了空類,沒啥意義。
定義一個成員變數
[修飾符] 型別 成員變數名 [=預設值]; //例如 boolean isMale; String color = "Blue";
成員變數包括例項變數和類變數,static修飾的成員變數稱作類變數,關於static之後再細講。
定義一個方法
[修飾符] 返回值型別 方法名(形參列表) { 零條到多條可執行語句組成的方法體... } //例如 void sleep(){ System.out.println(name+"is sleeping---"); } public void jump() { System.out.println(name+"is jumping---"); } public void laughAt(String otherName) { System.out.println(name+"is laughing at "+otherName); } //返回boolean型別的方法 boolean isNotMale() { return !isMale; }
定義一個構造器
[修飾符] 構造器名 (形參列表) { (零條到多條可執行語句組成的構造器執行體... } //例如 //構造方法 Cat() { System.out.println("cat is cute."); }
- 構造器用於構造類的例項,也就是建立某個類的物件時會自動呼叫構造方法,之後會討論。
- 構造器名一定要和類名相同!
- 沒有定義構造器的話,系統會提供預設的構造器。
設計類時的具體細節,接下來將會一一展開,還有未涉及到的內部類和程式碼塊部分,之後將會進行學習,暫且從這三個部分展開探究。
類的例項化
通過類構造屬於該類物件的過程就叫做類的例項化。物件是具體存在的事物,也稱作例項,可以呼叫類中定義的例項變數以及方法。(不考慮static修飾變數的情況下)
建立物件及使用物件:
//使用Cat類建立了Cat型別的物件 //並呼叫Cat類的構造器,返回Cat的例項,賦值給變數cat Cat cat = new Cat(); //訪問cat的例項變數name和isMale,併為他們賦值 cat.name = "sink"; cat.isMale = true; //呼叫cat的方法 cat.sleep(); cat.jump(); cat.laughAt("Susan"); //輸出isNotMale()方法的返回值 System.out.println(cat.isNotMale());
- 如果訪問許可權允許的情況下(訪問許可權涉及到private等關鍵字,暫且不談),類中定義的方法和成員變數都可以通過類或例項來呼叫。
- 建立物件:型別 例項名 = new 型別(引數列表);例如:Cat cat = new Cat();
- 呼叫類成員變數或方法:類.類變數或類.方法或例項.例項變數或例項.方法,類變數涉及static關鍵字,也是暫且放一邊,之後繼續回顧。
可以這麼理解:定義類就是為了建立許許多多該類的例項,這些例項具有相同的特徵。
建立物件的過程在記憶體中的表現
類是一種引用資料型別:也就是說,在棧記憶體裡的引用變數並不是真正儲存物件的成員變數,而是它的引用,實際的成員變數藏在堆記憶體中,這一點類似於前面提到過的陣列型別。而且,可以知道,棧記憶體中儲存的是實際物件在堆記憶體中的地址值,可以直接列印引用變數cat的值驗證。
建立物件
//建立物件,並初始化 Cat cat = new Cat();
訪問例項變數
//訪問例項變數 cat.name = "sink"; cat.isMale = true;
Java不允許直接訪問堆記憶體中的物件,只能通過該物件的引用操作該物件。
另外,堆記憶體中的同一個物件可以由棧記憶體中多個引用變數所指向。例如:
//把引用變數cat賦值給另一個引用變數otherCat Cat otherCat = cat;
這時,cat和otherCat都在棧記憶體中被建立,且他們都指向了原先cat所指向的那塊堆記憶體,所以他們操作的是同一個實際物件。
堆記憶體的物件沒有任何變數指向時,就會在一段時間內作為“垃圾”被Java的垃圾回收機制回收,釋放物件所佔用的記憶體區。
所以想讓他提前釋放,直接給引用變數賦值為null。
參考書籍:《瘋狂Java講義》
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。