[英]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
這是一個Human
( extends Human
)必須先創建Human
你里面Student
,並設置特殊的功能為您的學生像ID這是不是Human
( Human
有名字和等)。 因此,當您使用構造函數創建Student
時,也會調用超級構造函數(用於Human
)。
如前所述,我們為屬性提供了默認值,該屬性必須在創建和使用對象之前進行設置。 (為了正確使用它們)每個子類都使用super()
隱式調用超類構造函數,但是如果超類沒有任何默認構造函數(不帶參數的構造函數),則必須在子類的第一個留置權中明確說出super(...)
構造函數(否則編譯錯誤)
我只提到了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.