1. 程式人生 > 程式設計 >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進行修飾:

對於頂級類(外部類)來說,只有兩種修飾符: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講義》

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。