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進行修飾 - 類名命名規范:要見名知義,意思是需要多個有意義的英文單詞組成,每個單詞首字母大寫,規范這種東西,建議遵守!養成好習慣。
- 上面三種成員(構造器,成員變量,方法)都可以定義零個或多個,但是都是零個就變成了空類,沒啥意義。
定義一個成員變量
[修飾符] 類型 成員變量名 [=默認值];
//例如
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講義》
