JavaRush /Java Blog /Random-TW /類別簡介:編寫自己的類別、建構函數

類別簡介:編寫自己的類別、建構函數

在 Random-TW 群組發布
你好!今天我們來談談Java中的類別。 類別可以說是Java程式設計的核心。當您成為程式設計師時,您的主要任務將是編寫自己的具有不同功能的類別。 類別簡介:寫自己的類別、建構子 - 1讓我們弄清楚這個東西是什麼以及它是如何運作的:) 正如您所知,Java 是一種物件導向的程式語言。所有程式都由以某種方式相互連接的物件組成。類別本質上是物件的模板。它決定了一個物體的外觀和功能。每個物件都是某個類別的物件。讓我們來看一個最簡單的例子:
public class Cat {

    String name;
    int age;

}
假設我們正在編寫一個程序,在這個程序中我們需要貓來做某事(例如,我們有一個能夠在線預約的獸醫診所)。我們創建了一個類別Cat並為其指定了兩個變數 - 一個字串name和一個數字age。這樣的類別變數稱為字段。本質上,這是我們將來創建的所有貓的模板。每隻貓(類別物件Cat)都有兩個變數 - 名字和年齡。
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
就是這樣運作的!我們創建了一隻貓,給它起了名字和年齡,並將其全部輸出到控制台。沒什麼複雜的:) 類別通常描述周圍世界的物件和現象。一隻貓、一張桌子、一個人、閃電、書頁、輪子——所有這些都將在您的程式中使用單獨的類別創建。現在讓我們來看看我們在類別中創建的變數Cat。這些稱為字段或實例變數。事實上,這個名字揭示了它們的全部本質。類別的每個實例(物件)都會有這些變數Cat。我們創建的每隻貓都有自己的變數name和自己的age。一般來說,這是合乎邏輯的:對於真正的貓來說,一切都是一樣的:)除了實例變數之外,還有其他變數 - 類別變數或靜態變數。讓我們添加到我們的範例中:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
控制台輸出:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
現在我們的類別中有一個新變數 - count(數量)。她負責計算所創造的貓。每次我們在 main 方法中建立一隻貓時,我們都會將該變數加 1。變數由static關鍵字指定。這意味著它屬於該類,而不屬於該類的特定對象。當然,這是合乎邏輯的:如果每隻貓都應該有自己的名字,那麼我們就需要一個適合所有貓的計數器。這正是靜態這個詞可以讓你實現的目標——count所有貓都有相同的變數。請注意:當我們將其列印到控制台時,我們不寫barsik.countvasia.count。她既不屬於Barsik,也不屬於Vasya——她屬於整個班級Cat。所以,很簡單count。你也可以寫Cat.count——這也是正確的。name這不適用於 將變數輸出到控制台:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
錯誤!name每隻貓都有自己的。這就是編譯器感到困惑的地方。"將名字輸出到控制台?是誰的名字?:/"

方法

除了變數之外,每個類別還有方法。我們將在單獨的講座中更詳細地討論它們,但一般要點非常簡單。 方法是類別的功能;這個類別的物件可以做什麼。您已經熟悉其中一種方法 - 這就是main(). 但正如您所記得的,該方法main是靜態的 - 也就是說,它屬於整個類別(邏輯與變數相同)。普通的非靜態方法只能在我們建立的特定物件上呼叫。例如,如果我們想為一隻貓編寫一個類,我們需要了解貓在我們的程式中應該具有哪些功能。基於此,我們為它寫幾個方法:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();

    }
}
好吧,現在我們的課程更像是對一隻真正的貓的描述了!現在我們不僅有一隻叫 Barsik 的貓,它有名字和年齡。他還會喵喵叫和跳躍!什麼樣的貓沒有這樣的「功能」:) 我們採用一個特定的物件 - barsik,並呼叫它的方法sayMeow()jump()。我們來看看控制台:

Мяу!
Прыг-скок!
真正的貓!:)

創建您自己的課程。抽象

將來你將不得不編寫自己的類別。寫的時候要注意什麼?如果我們談論變量,您需要使用稱為抽象的東西。 抽像是物件導向程式設計的四個基本原則之一。它涉及突出對象的主要、最重要的特徵,反之亦然——丟棄次要的、無關緊要的特徵。例如,我們正在建立公司員工的檔案。為了創建員工對象,我們編寫了一個類別Employee。在公司檔案中描述員工的哪些特徵很重要?全名、出生日期、社會安全號碼、納稅識別號碼。但我們不太可能在公司員工卡上需要他的身高、眼睛和頭髮顏色。該公司不需要這些資訊。因此,對於類,Employee我們將設定變數String nameint ageint socialInsuranceNumberint taxNumber,我們將放棄對我們來說不必要的資訊(例如眼睛顏色)並將其抽象化。但如果我們為模特兒經紀公司創建照片模特兒目錄,情況就會發生巨大變化。為了描述一個時裝模特,身高、眼睛顏色和頭髮顏色對我們來說非常重要,但 TIN 號碼對我們來說絕對不重要。因此,在類別中Model我們需要建立變數int height, String hair, String eyes。這就是抽象的工作原理,很簡單!:)

建構函數

讓我們回到貓的例子。
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
查看這段程式碼並嘗試猜測我們的程式出了什麼問題。在我們的節目中的兩個小時裡,有一隻沒有名字或年齡的貓!當然,這是完全錯誤的。獸醫診所的資料庫中不應該有沒有貓資訊的貓。現在我們把它留給程式設計師。如果他沒有忘記註明自己的名字和年齡,一切都會好起來的。如果他忘記了,資料庫中就會出現錯誤,未知的貓。我們該如何解決這個問題呢?有必要以某種方式禁止創造沒有名字和年齡的貓。這就是構造函數為我們提供幫助的地方。這是一個例子:
public class Cat {

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
建構函數本質上是類別物件的模板。在本例中,我們指定必須為每個物件cat指定兩個參數 - 字串和數字。如果我們現在嘗試創造一隻無名的貓,我們將不會成功。
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
既然類別已經有了建構函數,Java 編譯器就知道物件應該是什麼樣子,並且不允許在沒有指定參數的情況下建立物件。現在讓我們看看this在建構函數中看到的關鍵字。對他來說一切都很簡單。「this」在英文中的意思是「這個,這個」。也就是說,這個字表示一個特定的物件。構造函數中的程式碼
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
幾乎可以按字面翻譯:“這隻貓的名稱(我們正在創建)=在構造函數中指定的名稱參數。這隻貓的年齡(我們正在創建)=在構造函數中指定的年齡參數。” 構造函數觸發後,您可以檢查我們的貓是否已分配了所有必要的值:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
控制台輸出:

Барсик
5
當構造函數完成時:
Cat barsik = new Cat("Barsik", 5);
裡面實際發生了以下事情:
this.name = "Barsik";
this.age = 5;
並且該物件barsik(它是this)從建構函數參數中分配了值。事實上,如果你沒有在類別中指定建構函數,它仍然會觸發建構函數!但這怎麼可能呢?O_O 事實上,在 Java 中,所有類別都有一個所謂的預設建構子。它沒有任何參數,但每次創建任何類別的任何物件時都會觸發它。
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
乍看之下這並不明顯。好了,我們創建了一個物件並創建了它,設計師的工作在哪裡?為了看到這一點,讓我們Cat親手為該類別編寫一個空的建構函數,並在其中向控制台輸出一些短語。如果顯示出來,那麼建構函式已經工作了。
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
控制台輸出:

Создали кота!
這是確認。預設構造函數始終不可見地存在於您的類別中。但您還需要了解它的另一個功能。 當您建立帶有參數的建構函式時,預設建構函式將從類別中消失。 這一點的證明,其實我們在上面已經看到了。在此程式碼中:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
我們無法創建沒有名字和年齡的貓,因為我們定義了一個建構函數Cat:字串+數字。此後,預設構造函數立即從類別中消失。因此,一定要記住:如果你的類別中需要多個建構函數,包括一個空的建構函數,那麼你需要單獨建立它。例如,我們的獸醫診所想要做好事,幫助無家可歸的貓,但我們不知道它們的名字和年齡。那我們的程式碼應該是這樣的:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
現在我們已經明確指定了預設建構函數,我們可以建立兩種類型的貓。在建構函式中,您可以明確賦值,而不僅僅是從參數中取得值。例如,我們可以將所有街頭貓以「街頭貓編號...」的名稱記錄在資料庫中:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
我們有一個變數count是街頭貓計數器。每次執行預設構造函數時,我們都會將其加 1 並將該數字指定為貓的名字。 對於建構函數來說,參數的順序非常重要。 讓我們在建構函式中交換名稱和年齡參數。
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
錯誤!建構函數清楚地描述了:在建立物件時,Cat必須按順序傳遞一個數字和一個字串。這就是為什麼我們的程式碼不起作用。請務必記住這一點,並在創建自己的類別時牢記這一點:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
這是兩個完全不同的設計師! 現在解決幾個問題來鞏固材料:)
  • 古物博物館。
你的任務是設計類別Artifact。館內收藏的文物分為三種。第一個是除了博物館分配的序號(例如:212121)之外一無所知。第二個是已知序號和創建它的文化(例如:212121、「阿茲特克人」)。第三種類型是已知序號、創建它的文化以及創建它的確切年齡(例如:212121,“Aztecs”,12)。創建一個類別Artifact來描述博物館中儲存的古物,並為其編寫所需數量的構造函數。在該方法中main(),為每種類型建立一個工件。
public class Artifact {

    public static void main(String[] args) {
    }
}
  • 會議網站
您正在為約會網站建立使用者資料庫。但問題是你忘記了它們需要按什麼順序指定,而且你手邊也沒有技術規格。設計一個User包含欄位的類別 - 姓名 ( String)、年齡 ( short) 和身高 ( int)。為其建立所需數量的建構函數,以便可以以任意順序指定名稱、年齡和身高。
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION