12. 定義類 【連載 12】

12. 定義類 【連載 12】

Java 是面向對象的編程語言,我們可以使用 Java 來模擬現實世界的任何事物,其中 有非常重要的作用。在【面向對象的初步理解】中已經做過其基本的講解,這次內容,主要來告訴你如何在 Java 中定義類。

成員變量

現在使用 Java 語言來模擬汽車,其屬性,其行爲。汽車對應到 Java 世界中是一個類:

public class Car {

}

汽車的製造商、里程錶、最高時速我們可以用類的成員變量來表示:

public class Car {
    String make;//製造商
    double odometer;//里程
    int maxSpeed;//最高時速
}

在一個類中,除了基本類型變量之外,還可以使用引用類型變量,作爲成員變量。比如給汽車增加一個引擎的屬性。

定義引擎:

public class Engine {
  double power = 5.5;//動力
}

Car 增加引擎屬性:

public class Car {
  String make;//製造商
  double odometer;//里程
  int maxSpeed;//最高時速
  Engine engine;//引擎
}

成員方法

汽車除了有其屬性之外,當然還有它自己的行爲,在類中用方法來模擬汽車的行爲。汽車啓動、汽車行駛用兩個成員方法來表示:

public class Car {
  String make;//製造商
  double odometer;//里程
  int maxSpeed;//最高時速
  Engine engine;//引擎

  //汽車啓動
  public void starup() {
    System.out.println(make + ", 啓動了");
  }

  //汽車行駛
  public void run() {
    System.out.println("80, 行駛");
  }

}

構造方法

在一個類中還有一種重要的方法,就是構造方法,被稱爲構造器,它的作用是用來創建對象的。當我們使用一個類去創建一個對象的時候,會調用其相應的構造方法,來創建一個對象實例。構造方法有自己的一些規則,有別於普通的成員方法。

構造方法需要滿足以下條件:

  1. 方法的名字必須和類的名字保持一致。
  2. 構造方法是沒有返回值的。

給汽車類增加構造函數:

public class Car {
  String make;//製造商
  double odometer;//里程
  int maxSpeed;//最高時速
  Engine engine;//引擎

  //空構造,也是默認構造。
  public Car() {
    System.out.println("調用了空構造方法");
  }

  //汽車啓動
  public void starup() {
    System.out.println(make + ", 啓動了");
  }

  //汽車行駛
  public void run() {
    System.out.println("80, 行駛");
  }

}

定義了一個空的構造,方法中沒有任何的代碼邏輯。這也是一個類的默認構造方法。意思是說:如果一個類沒有像上面顯示的什麼任何構造方法的時候,當我們創建對象的時候,會自動調用一個空的構造方法。

public static void main(String[] args) {
  Car myCar = new Car();
}
  • Car myCar:聲明瞭一個Car類型的變量。
  • new : 一個創建對象的關鍵字。
  • Car() :調用構造方法

除了空構造方法之外,可以自一個類中定義多個構造方法,但是這些個構造方法之間參數不能一樣。我們再定義兩個構造方法:

public class Car {
  String make;//製造商
  double odometer;//里程
  int maxSpeed;//最高時速
  Engine engine;//引擎

  //空構造,也是默認構造。
  public Car() {
    System.out.println("調用了空構造方法");
  }
  //一個參數的構造方法,可以傳遞make值,創建一個對象
  public Car(String make) {
    this.make = make;
  }

  //多個參數的構造
  public Car(String make, double odometer, int maxSpeed, Engine engine) {
        this.make = make;
        this.odometer = odometer;
        this.maxSpeed = maxSpeed;
        this.engine = engine;
  } 

  //汽車啓動
  public void starup() {
    System.out.println(make + ", 啓動了");
  }

  //汽車行駛
  public void run() {
    System.out.println("80, 行駛");
  }

}

使用不同的構造方法來創建對象:

public static void main(String[] args) {
  Car myCar  = new Car();
  Car poloCar = new Car("polo");
  Engine engine = new Engine();
  Car miniCar = new Car("mini", 50.5, 200, engine);
}

方法重載

汽車的類中,存在三個參數不一樣的構造方法。這種情況其實是一種方法重載的現象。

方法重載:在一個類中方法名相同,方法的參數不一樣的現象叫做方法重載。

方法參數不一樣包括情況:

  • 方法的參數的類型相同,個數不相同
  • 方法的個數相同,類型不相同

原則是隻要方法的參數不一樣,在調用的時候,能夠正確的區分是調用哪個方法,就 OK

構造方法可以重載,當然其他的成員方法也是可以重載的。比如 Car 中的run方法:

//汽車行駛
  public void run() {
    System.out.println("80, 行駛");
  }

//指定某個速度行駛
public void run(int speed) {
  System.out.println("以"+ speed +"的速度行駛");
}

兩個 run 方法的參數不一樣,構成了方法重載。方法重載主要是爲了適應不同的場景。像你買一份涼皮,有人喜歡加辣,有人不要辣。

調用兩個方法:

public static void main(String[] args) {
  Car myCar  = new Car();
  myCar.run();
  myCar.run(200);
}

現在已經瞭解一個類的基本結構,我們可以根據實際的情況去定義其屬性和方法。下面要介紹的是變量和方法的可見性。

可見性

所謂可見性,就是說針對一個變量和方法,誰可以方法調用。主要的針對兩類情況,類的內部和類的外部。

控制變量和方法可見性的是修飾詞:

  • private 私有的,不公開。修飾的變量和方法只有在其類的內部 可以被調用,對類的外部不可見。
  • protected 保護的,有權限的公開。修飾的變量和方法只有同一個包下的其他類可以調用,對其他的類不可見。變量和方法沒有任何修飾詞的時候,默認效果和 protected 修飾一樣。
  • public 完全公共的,修飾的變量和方法對其他的類完全公開,可以被訪問和調用。

對於變量,如果使用 private 修飾的話,起到一個保護作用,這種做法叫封裝。只有通過調用其對應對象的公開的方法纔可以訪問被封裝的變量屬性。

對於方法,一般都會使用 public 修飾,方法公開被調用。如果該方法只是本類的內部使用,我們可以使用 private 修飾。

對於構造方法,如果用private 修飾的話,在該類的外部將不能創建實例對象。這種做法可以用來實現單例模式,後面有內容會講的。

OK,對於類的定義,我們基本用到的一些規則給你做了介紹。下次內容着重來說一說類的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章