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