【问题标题】:Inheritance and Constructors in JavaJava中的继承和构造函数
【发布时间】:2012-10-09 15:55:22
【问题描述】:

所以,我正在做家庭作业,但我很难按照一些指示进行操作,我已将作业粘贴在下面:

创建一个包含五个类的层次结构,外加一个作为变量包含在内的类:

  1. Person 有四个字符串变量:姓名、地址、电话、电子邮件
  2. Student 是 Person 的子类,并且有一个额外的 int 变量状态,它的值是 1、2、3 或 4,分别代表大一、大二、大三、大四
  3. MyDate 具有年、月和日的三个 int 变量
  4. Employee 是 Person 的子类,有一个 String 变量 office,一个 int 变量表示薪水,一个 MyDate 变量表示 dateHired
  5. Staff 是 Employee 的子类,并且有一个额外的 String 变量作为 title
  6. Faculty 是 Employee 的子类,并且有一个额外的字符串变量用于等级,它采用教授、副教授、助理教授、讲师和兼职的值。所有六个类的数据都应该是私有的。

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

让我陷入循环的部分是这样一种想法,即可以编写一个构造函数来覆盖 setter 和 getter 的所有必要参数,而不是在每个子类中编写它们。这可能吗?那是怎么回事?

【问题讨论】:

  • 你误会了。它们意味着每个类只有一个构造函数。
  • @EJP 是正确的。 Person 和 MyDate 是类,Faculty and Staff 是 Employee 的子类。此外,Student 和 Employee 是 Person 的子类。您可以说教职员工是“is-a(n)”员工,因此它是“is-a”关系。
  • 对教师价值观使用枚举。

标签: java inheritance constructor subclass


【解决方案1】:

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

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()方法。

【讨论】:

    【解决方案2】:

    这是你可以做的

    Person(String name,String address,String phone,String email){
     //Person constructor
     this.name = name;
     this.address = address;
     this.phone = phone;
     this.email = email;
    }
    
    public String toString(){
    //toString method
    return "Name: "+name+" Address: "+address+" Phone: "+phone+" Email: "+email;
    }
    

    【讨论】:

      【解决方案3】:

      而不是写

       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()的实现只是一个例子,它只需要打印所有字段的状态)

      【讨论】:

        【解决方案4】:

        对于方法,如果您编写一个具有所有数据参数的构造函数并覆盖 toString( ) 方法,则可以跳过普通的 setter 和 getter。

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

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

        同样覆盖toString() 以报告所有信息。

        【讨论】:

          猜你喜欢
          • 2020-08-07
          • 2013-03-21
          • 2011-09-09
          • 2010-12-11
          • 1970-01-01
          • 2018-10-30
          • 1970-01-01
          • 2010-10-06
          相关资源
          最近更新 更多