当前位置: 首页 > 知识库问答 >
问题:

Java中的继承和构造函数

王景山
2023-03-14

所以,我正在做一个家庭作业,我很难遵循一些指示,我把作业贴在下面:

创建一个由五个类组成的层次结构,加上一个作为变量包含在里面的类:

  1. Person有四个字符串变量:姓名,地址,电话,电子邮件
  2. 学生是Person的子类,有一个额外的int变量状态,其值为1,2,3或4,代表大一,大二,大三,大四
  3. MyDate有三个int变量,分别为年、月和日
  4. 员工是Person的子类,有一个String变量office,一个int变量用于工资,一个MyDate变量用于dateHired
  5. 员工是员工的子类,有一个额外的字符串变量标题
  6. 教师是员工的子类,有一个额外的String变量用于等级,它包含教授、副教授、助理教授、讲师和副教授的值。所有六个类的数据都应该是私有的。

至于方法,如果编写一个包含所有数据参数的构造函数并重写toString()方法,则可以跳过普通的setter和getter。子类的构造函数应该使用超类构造函数。子类的toString()方法应该使用其超类的toString()方法。

让我感到困惑的部分是,可以编写一个单一的构造函数来覆盖setter和getter的所有必要参数,而不是将它们写入每个子类。这可能吗?怎么可能?

共有3个答案

凤柏
2023-03-14

而不是写作

 public class A {
   private int b;
   private int c;

   public void setB(int b) {this.b = b;}
   public int getB() {return b;}

   // same for c
}

你可以编码吗

 public class A {
   private int b;
   private int c;

   public A(int b, int c) {
     this.b = b;
     this.c = c;
   }

   @Override
   public String toString() {
     return "[b = " + b + ", c = " + c + "]";
}

(toString()的实现只是一个例子,它只需要打印所有字段的状态)

柯波峻
2023-03-14

至于方法,如果编写一个包含所有数据参数的构造函数并重写toString()方法,则可以跳过普通的setter和getter。

我认为这些指示意味着您编写的每个类都可以有一个为其所有数据接受参数的构造函数。以MyDate构造函数为例:

public MyDate(int year, int month, int day) {
    ...
}

同样地,重写toString()来报告所有这些信息。

陶鹏
2023-03-14

在创建子类时,需要使用超类的构造函数。所以应该是:

public class Staff extends Employee {    

    private String title;    

    public Staff(String name, String address, String phone, String email, int status, String title) {
        super(name, address, phone, email, status);
        this.title = title;
    }    
}

使用super(/*params of super class*/)调用超类的构造函数并实例化继承的属性。请注意,只能将超类构造函数作为构造函数的第一条语句调用。如果不显式调用超类构造函数,Java编译器会自动插入对super()的调用(超类的默认构造函数)。

调用父类的toString()使用:

public String toString() {
    return super.toString() + " ,title : " this.title;    
}

同样地,编写所有类的构造函数和toString()方法。

 类似资料:
  • 问题内容: 在为期末考试而学习时,我在正在学习的书中遇到了以下陈述。考虑以下代码: 是否必须在类B(super(x))的构造函数中调用类A的构造函数。本书指出这不是强制性的,因为它们具有确切数量和类型的参数。但是,当我在Java编译器中尝试此操作时,会抛出以下错误: 类A中的构造函数A不能应用于给定类型;必需:发现整数:无参数原因:实际和正式参数列表的长度不同 问题答案: 编译器会自动插入开头。

  • 问题内容: 我想知道为什么在Java中不继承构造函数?你知道当你上这样的课时: 稍后当你从继承时Super,java会抱怨没有定义默认的构造函数。解决方案显然是这样的: 这段代码是重复的,而不是干的和无用的(IMHO)…因此再次带来了问题: 为什么Java不支持构造函数继承?不允许这种继承有什么好处? 问题答案: 假设构造函数是继承的…则因为每个类最终都派生自Object,所以每个类最终都将带有无

  • 问题内容: 我想要一个构造函数,其参数会自动被所有子类继承,但是Java不允许我这样做 我不希望有写,等等。每个子类。有没有更聪明的方法来解决这个问题? 解决方案#1。构造一个可以在构造函数之后调用的方法。尽管对我的特定设计而言,这是可行的,但是我希望要求用户在构造函数中指定在编译时经过验证的某些参数(例如,不通过varargs / reflection)。 问题答案: 你不能 如果要在基类中有一

  • 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // OK // 调用的到底是B::f(doube)还是D::f(int)呢? // 实际情况往往会让人感到意外

  • 本文向大家介绍JS继承之借用构造函数继承和组合继承,包括了JS继承之借用构造函数继承和组合继承的使用技巧和注意事项,需要的朋友参考一下 借用构造函数继承  在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数。 

  • 我有一个继承自父类Point的子类行,我没有在子类中使用基类的构造函数,但是我得到了这个错误: '形状。点“不包含接受0个参数的构造函数 这是我的父类: 这是我的孩子班: