1. 程式人生 > >Java類的定義與類的例項化

Java類的定義與類的例項化

目錄

  • Java類的定義與類的例項化
    • 類的定義
      • 定義一個簡單的類
      • 定義一個成員變數
      • 定義一個方法
      • 定義一個構造器
    • 類的例項化
      • 建立物件及使用物件:
      • 建立物件的過程在記憶體中的表現

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講