使用构造函数创建超类和子类-Java

时间:2018-10-02 21:11:26

标签: 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) {

    }
}

我对如何设置超类和子类的构造函数,甚至构造函数的外观非常困惑。我已经在互联网上看到了很多示例,但是没有人真正强调过构造器的实际部分,也没有突出显示所有内容之间的可视联系,这对我有帮助。

我想我在理解如何设置调用对象的方法上也遇到了问题。如果有人有时间提供帮助,将不胜感激。谢谢!

4 个答案:

答案 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是不好的,因为也许我们忘了给它起适当的名称并错误地使用了它。 构造函数迫使我们提供从类实例化对象所需的最少内容。

继承中的构造函数实现

关于继承,是不同的。当您要创建StudentHuman)的extends Human时,必须先在Human内创建Student并为学生设置特殊功能,例如不适用于Human的ID(Human具有名称等)。因此,当您使用构造函数创建Student时,也会调用超级构造函数(用于Human)。

我们在构造函数中做什么

正如我提到的,我们为属性提供了默认值,该属性必须在创建和使用对象之前进行设置。 (为了正确使用它们)每个子类都使用super()隐式调用超类构造函数,但是如果超类没有任何默认构造函数(不带参数的构造函数),则必须在第一个留置权中明确说出super(...)子类构造函数(否则,编译错误)

使用构造函数(高级)时的程序步骤是什么

  1. 超级类静态构造函数和静态变量(如果您想了解我在这里所说的话,请自行阅读)
  2. 子类类的静态构造函数和静态变量
  3. 超类变量和块构造器
  4. 超类构造函数
  5. 子类变量和块构造器
  6. 子类构造函数

我只提到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());
    }
}