我是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) {
}
}
我对如何设置超类和子类的构造函数,甚至构造函数的外观非常困惑。我已经在互联网上看到了很多示例,但是没有人真正强调过构造器的实际部分,也没有突出显示所有内容之间的可视联系,这对我有帮助。
我想我在理解如何设置调用对象的方法上也遇到了问题。如果有人有时间提供帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
我想你想要这样的东西。请注意,在这种情况下,最好将每个文件一个类分开,因为它们是单独的实体。最好使用封装将数据访问限制在实体字段中。
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模式),但这是最基本且可理解的方法。还有其他几种方法可以执行此操作,但这应该可以帮助您入门,希望对您有所帮助!
答案 1 :(得分:0)
constructor是与其他方法类似的方法,但是在实例化(或从类中创建对象)以初始化对象以供首次使用或以后使用时调用。例如,当我们给它命名和姓氏时,必须创建(实例化)诸如Student
之类的类。没有它们,创建一个Student
是不好的,因为也许我们忘了给它起适当的名称并错误地使用了它。 构造函数迫使我们提供从类实例化对象所需的最少内容。
关于继承,是不同的。当您要创建Student
(Human
)的extends Human
时,必须先在Human
内创建Student
并为学生设置特殊功能,例如不适用于Human
的ID(Human
具有名称等)。因此,当您使用构造函数创建Student
时,也会调用超级构造函数(用于Human
)。
正如我提到的,我们为属性提供了默认值,该属性必须在创建和使用对象之前进行设置。 (为了正确使用它们)每个子类都使用super()
隐式调用超类构造函数,但是如果超类没有任何默认构造函数(不带参数的构造函数),则必须在第一个留置权中明确说出super(...)
子类构造函数(否则,编译错误)
我只提到4和6。 我试图完全解释。我英文不太好。对不起。
答案 2 :(得分:0)
如果您知道方法的工作原理,那么您就知道构造函数的工作原理。构造函数只是一个特殊的方法,允许您在创建对象之前执行一些代码。
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;
}
答案 3 :(得分:0)
我想您可以通过以下代码片段在单个文件中实现所需的功能: 您可以将其复制粘贴到您的代码中,它应该可以工作。
您可以看到在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());
}
}