繁体   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