[英]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.