Java物件和類


Java是物件導向的語言。 作為具有物件導向功能的語言,Java支援以下基本概念 -

  • 多型性
  • 繼承
  • 封裝
  • 抽象化
  • 物件
  • 範例
  • 方法
  • 訊息傳遞

在本節中,我們將學習兩個概念 - 類和物件。

  • 物件 - 物件具有狀態和行為。 例如:一隻狗的狀態有:顏色,名稱,品種,它的行為有:搖尾巴,吠叫,吃東西。 物件是類的範例。
  • - 可以將類定義為描述其型別物件支援的行為/狀態的模板/藍圖。

1. Java物件

下面將深入了解什麼是物件。 如果考慮現實世界,可以在我們周圍找到許多物件,如:汽車,狗,人等等。所有這些物件都有狀態和行為。

如果考慮一隻狗,那麼它的狀態是 - 名稱,品種,顏色,並且它的行為是 - 吠叫,搖尾巴,跑步。

如果將軟體物件與實際物件進行比較,則它們具有非常相似的特徵。
軟體物件也具有狀態和行為。 軟體物件的狀態儲存在欄位中,行為通過方法顯示。
因此,在軟體開發中,方法對物件的內部狀態進行操作,並且物件到物件的通訊是通過方法完成的。

2. Java類

類是建立單個物件的藍圖(模板)。以下是一個類的範例程式碼。

public class Dog {
   String breed;
   int age;
   String color;

   void barking() {
   }

   void hungry() {
   }

   void sleeping() {
   }
}

類可以包含以下任何變數型別。

  • 區域性變數 - 在方法,建構函式或塊中定義的變數稱為區域性變數。 變數將在方法中宣告和初始化,並且在方法完成時將銷毀變數。
  • 範例變數 - 範例變數是類中的變數,但在方法之外。 在範例化類時初始化這些變數。 可以從類的任何方法,建構函式或塊內部存取範例變數。
  • 類變數 - 類變數是使用static關鍵字修飾,它是在類中的方法之外宣告的變數。

一個類可以有任意數量的方法。 在上面的例子中,barking()hungry()sleeping()都是類的方法。

以下是在學習Java語言類和物件時,需要了解的一些重要主題內容。

建構函式

在討論類時,最重要的子主題之一是建構函式。 每個類都有一個建構函式。 如果沒有為類顯式編寫建構函式,Java編譯器會自動為該類構建一個預設建構函式。

每次建立新物件時,都將至少呼叫一個建構函式。建構函式的主要規則是它與類具有相同的名稱。 一個類可以有多個建構函式。

以下是建構函式的範例 -

public class Dog {
   // 無引數建構函式
   public Dog() {
   }
   // 有引數建構函式
   public Dog(String name) {
      // 此建構函式有一個引數:name。
   }
}

Java還支援單範例類,它是一種建立一個類只有一個範例設計模式。

注意 - 有兩種不同型別的建構函式。 我們將在後續章節中詳細討論建構函式。

建立物件

如前所述,類提供了物件的藍圖。一個物件是從一個類建立的。 在Java中,new關鍵字用於建立新物件。

從類建立物件時有三個步驟 -

  • 宣告 - 具有變數名稱和物件型別的變數宣告。
  • 範例化 - new關鍵字用於建立物件。
  • 初始化 - new關鍵字後跟對建構函式的呼叫,此呼叫初始化新物件。

以下是建立物件的範例程式碼 -

public class Dog {
   public Dog(String name) {
      // 這個建構函式有一個引數:anem
      System.out.println("傳入的引數值是: " + name );
   }

   public static void main(String []args) {
      // 以下語句將建立一個物件: myDog
      Dog myDog = new Dog( "小屁狗" );
   }
}

編譯並執行上面範例程式碼,得到以下結果:

傳入的引數值是: 小屁狗

存取範例變數和方法

通過建立的物件存取範例變數和方法。 要存取範例變數,以下是完全限定的路徑 -

/* 首先建立一個物件 */
ObjectReference = new Constructor();

/* 呼叫變數如下 */
ObjectReference.variableName;

/* 現在,可以按如下方式呼叫類方法 */
ObjectReference.MethodName();

下面範例說明如何存取類的範例變數和方法。

public class Dog {
    int dogAge;

    public Dog(String name) {
        // 此建構函式有一個引數:name
        System.out.println("設定的小狗名字是: " + name);
    }

    public void setAge(int age) {
        dogAge = age;
    }

    public int getAge() {
        System.out.println("小狗的年齡是: " + dogAge);
        return dogAge;
    }

    public static void main(String[] args) {
        /* 建立物件 */
        Dog myDog = new Dog("小屁狗");

        /* 呼叫方法來設定狗的年齡 */
        myDog.setAge(2);

        /* 呼叫另一個方法來獲取狗的年齡 */
        myDog.getAge();

        /* 也可以按如下方式存取範例變數:dogAge */
        System.out.println("變數的值是:" + myDog.dogAge);
    }
}

編譯並執行上面範例程式碼,得到以下結果:

設定的小狗名字是: 小屁狗
小狗的年齡是: 2
變數的值是:2

原始檔宣告規則

在原始檔中宣告類,import語句和package語句時,這些規則是必不可少的。

  • 每個原始檔只能有一個public類。
  • 原始檔可以有多個非public類。
  • public類名稱也應該是原始檔的名稱,最後以.java作為擴充套件名。 例如:類名是public class Employee{},那麼原始檔應該是:Employee.java
  • 如果在包內定義了類,則package語句應該是原始檔中的第一個語句。
  • 如果存在import語句,則必須在package語句和類宣告之間寫入它們。如果沒有package語句,則import語句應該是原始檔中的第一行。

類具有多個存取級別,並且有不同型別的類; 抽象類,final類等。我們將在存取修飾符章節中解釋所有這些。

除了上面提到的類型別之外,Java還有一些特殊類:內部類和匿名類。

Java包

簡而言之,它是一種對類和介面進行分類的方法。 在Java中開發應用程式時,將編寫數百個類和介面,因此必須對這些類進行分類,以使生活變得更加容易。Java包也是用於解決命名衝突的問題。

import語句

在Java中,如果給出了包含包和類名的完全限定名稱,則編譯器可以快速地找到原始碼或類。 import語句是一種為編譯器提供正確位置以查詢特定類的方法。

例如,以下行將要求編譯器載入目錄java_installation/java /io中可用的所有類 -

import java.io.*;

3. 一個簡單學習案例

在這個學習案例中,將建立兩個類。 它們是:EmployeeEmployeeTest

首先開啟記事本並新增以下程式碼。Employee類是公共(public)類。因此使用檔案名稱為:Employee.java 儲存此原始檔。

Employee類有四個範例變數 - name, age, designationsalary。 該類有一個顯式定義的建構函式,它接受一個引數。

import java.io.*;

public class Employee {

    String name;
    int age;
    String jobPosition;
    double salary;

    // 這是Employee類別建構函式
    public Employee(String name) {
        this.name = name;
    }

    // 設定員工的年齡,將empAge的分配給變數:age。
    public void empAge(int empAge) {
        age = empAge;
    }

    /* 設定員工的工作崗位. */
    public void setJobPosition(String jobPosit) {
        jobPosition = jobPosit;
    }

    /* 設定員工的薪水,將empSalary的分配給變數:salary。 */
    public void empSalary(double empSalary) {
        salary = empSalary;
    }

    /* 列印員工詳細資訊 */
    public void printEmployee() {
        System.out.println("------------------------------------");
        System.out.println("姓名:" + name);
        System.out.println("年齡:" + age);
        System.out.println("工作崗位:" + jobPosition);
        System.out.println("薪水:" + salary);
    }
}

如本教學前面所述,程式從main方法開始執行。 因此,要執行這個Employee類,應該有一個main方法,並且應該建立物件。接下來將為這些任務建立一個單獨的類:EmployeeTest

EmployeeTest類中,它建立Employee類的兩個範例,並為每個物件呼叫方法以為每個變數賦值。將以下程式碼儲存在EmployeeTest.java 檔案中。

import java.io.*;
public class EmployeeTest {

   public static void main(String args[]) {
      /* 使用建構函式建立兩個物件 */
      Employee empOne = new Employee("Maxsu");
      Employee empTwo = new Employee("張小龍");

      // 為每個建立的物件呼叫方法
      empOne.empAge(26);
      empOne.setJobPosition("高階軟體工程師");
      empOne.empSalary(15999);
      empOne.printEmployee();

      empTwo.empAge(42);
      empTwo.setJobPosition("產品經理");
      empTwo.empSalary(999999);
      empTwo.printEmployee();
   }
}

現在,編譯這兩個類,然後執行得到結果如下 -

D:/worksp/java> javac Employee.java
D:/worksp/java> javac EmployeeTest.java
D:/worksp/java> java EmployeeTest
------------------------------------
姓名:Maxsu
年齡:26
工作崗位:高階軟體工程師
薪水:15999.0
------------------------------------
姓名:張小龍
年齡:42
工作崗位:產品經理
薪水:999999.0