簡體   English   中英

使用構造函數創建超類和子類-Java

[英]Creating a superclass and subclass with constructors - Java

我是Java新手。 我有一個要解決的問題,但我不太了解構造函數的工作方式。 我了解如何創建超類和子類,但不了解其中的構造函數(或它們的實際工作方式-我對構造函數進行了大量的研究,但這沒有多大意義)。

我正在嘗試編寫一個程序,該程序創建一個稱為Employees的超類。 該Employee類具有實例變量employeeId(它是一個整數)和employeeName(它是一個字符串)。

子類稱為管理器。 Manager子類具有一個名為employeeTitle(它是一個字符串)的實例變量。 它還有一個名為managerDetails()的方法。 ManagerDetails()應該顯示employeeId,employeeName和employeeTitle。

這是我到目前為止的內容:

package tryingoutjava;

public class TryingOutJava {

    class Employee {

        int employeeId;
        String employeeName;

        void Employee() {

        }
    }

    class Manager extends Employee {

        String employeeTitle;

        void managerDetails() {

        }
    }

    public static void main(String[] args) {

    }
}

對於如何為超類和子類設置構造函數,甚至構造函數的外觀,我感到非常困惑。 我在互聯網上看到過很多示例,但是沒有人真正強調過構造器的實際部分,或者所有內容如何以可視方式鏈接,這對我的學習有所幫助。

我想我在理解如何設置調用對象的方法上也遇到了問題。 如果有人有時間提供幫助,將不勝感激。 謝謝!

我想你想要這樣的東西。 請注意,在這種情況下,最好將每個文件一個類分開,因為它們是單獨的實體。 最好使用封裝將數據訪問限制在實體字段中。

Employee.java:

package tryingoutjava;

public class Employee {

    // Protected access because we want it in Manager
    protected int employeeId;
    protected String employeeName;

    public Employee(int employeeId, String employeeName) {
        this.employeeId = employeeId;
        this.employeeName = employeeName;
    }
}

Manager.java:

package tryingoutjava;

public class Manager extends Employee {

    private String employeeTitle;

    public Manager(String employeeTitle, int employeeId, String employeeName) {
        // Use super to invoke Employee constructor
        super(employeeId, employeeName);
        this.employeeTitle = employeeTitle;
    }

    // Just create a simple string describing manager
    @Override
    public String toString() {
        return "Manager{" +
                "employeeTitle='" + employeeTitle +
                "employeeId=" + employeeId +
                ", employeeName='" + employeeName + '\'' +
                '}';
    }
}

Application.java:

package tryingoutjava;

public class Application {

    // Example of construction plus printing of Manager data
    public static void main(String[] args) {
        Employee davie = new Employee(1, "Dave The Cable Guy");
        Manager tom = new Manager("CFO", 2, "Tomas");
        System.out.println(tom.toString());
    }
}

構造函數(大多數情況下)只是通過super調用來委托父結構。 盡管還有其他技術(例如Builder模式),但這是最基本且可理解的方法。 還有其他幾種方法可以執行此操作,但這應該可以幫助您入門,希望對您有所幫助!

構造目的

構造函數與其他方法一樣,但是在實例化(或從類中創建對象)以初始化對象以供首次使用或以后使用時調用。 例如,當我們給它命名和姓氏時,必須創建(實例化)像Student類的類。 沒有他們,創建一個Student不好,因為也許我們忘記給它起適當的名字而錯誤地使用了它。 構造函數迫使我們提供從類實例化對象所需的最少內容。

繼承中的構造函數實現

關於繼承,是不同的。 當你想創建一個Student這是一個Humanextends Human )必須先創建Human你里面Student ,並設置特殊的功能為您的學生像ID這是不是HumanHuman有名字和等)。 因此,當您使用構造函數創建Student時,也會調用超級構造函數(用於Human )。

我們在構造函數中做什么

如前所述,我們為屬性提供了默認值,該屬性必須在創建和使用對象之前進行設置。 (為了正確使用它們)每個子類都使用super()隱式調用超類構造函數,但是如果超類沒有任何默認構造函數(不帶參數的構造函數),則必須在子類的第一個留置權中明確說出super(...)構造函數(否則編譯錯誤)

使用構造函數時的程序步驟是什么(高級)

  1. 超類靜態構造函數和靜態變量(如果您想了解更多我在這里說的話,請自行閱讀)
  2. 子類類靜態構造函數和靜態變量
  3. 超類變量和塊構造函數
  4. 超類構造函數
  5. 子類變量和塊構造函數
  6. 子類構造函數

我只提到了4和6。我試圖完全解釋。 我英文不太好。 對不起。

如果您知道方法的工作原理,那么您就知道構造函數的工作原理。 構造函數只是一個特殊的方法,允許您在創建對象之前執行一些代碼。

Person p = new Person("Bob", 25); // Calls constructor Person(String name, int age)

然后,在構造函數中,您可以執行將初始值分配給任何實例變量的操作。

private String name;
private int age;

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

如果該類是子類,則需要在創建對象之前調用父類的構造函數,除非父類具有沒有參數的構造函數,在這種情況下,如果您不指定任何內容,java可以為您調用它。 這里工人延伸人。

private String occupation;

public Worker(String name, int age, String occupation) {
    super(name, age) // Calls constructor Person(String name, int age)
    this.occupation = occupation;
}

我想您可以通過下面的代碼片段在單個文件中實現所需的功能:您可以將其復制粘貼到您的代碼中,並且可以正常工作。

您可以看到如何通過super()以及方法來調用父類的構造函數。 在這里,我使用了諸如getEmployeeTitle()之類的方法,該方法應該可以幫助您概述如何編寫方法。 我還重寫了toString()方法,以便您可以了解如何重寫Object類的有用方法,例如toString()。

注意:盡管為了簡單起見,我在一個代碼段中創建了所有類,但是強烈建議您為每個這些類創建一個單獨的文件。

class Employee {

    int employeeId;
    String employeeName;

    Employee(int employeeId, String employeeName) {
        this.employeeId = employeeId;
        this.employeeName = employeeName;
    }

}

class Manager extends Employee {

    private String employeeTitle;

    Manager(int employeeId, String employeeName, String employeeTitle) {
        super(employeeId, employeeName);
        this.employeeTitle = employeeTitle;
    }

    public String getEmployeeTitle() {
        return employeeTitle;
    }

    @Override
    public String toString() {
        return ("employeeId: " + employeeId + ", employeeName: " + employeeName + ", employeeTitle" + employeeTitle);
    }
}

public class TryingOutJava {
    public static void main(String[] args) {
        Manager manager = new Manager(007, "John Doe", " Sr. Manager");
        System.out.println(manager);
        System.out.println(manager.getEmployeeTitle());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM