java - 在给定的代码块中查找错误(类的扩展,个人/学生)

标签 java oop

在下面的代码块中,有几个(故意的)错误,我的任务是找到它们并解释这些错误是否会导致编译代码时出现问题,或者至少会导致一些逻辑问题。

public class Person {

  private String name;

  public Person(String name) {

    name = name;

  }

  public String toString() {

    return "Name: " + name;

  }
}

public class Student expands Person {

  private int Nr;

  public Student(String name, int Nr) {

    name = name;

    Nr = Nr;

  }

   public String toString() {

   return toString() + " Nr: " + Nr;

  }
}

据我所知,第一个错误是在 Person 类的第四行。虽然 name = name 不应导致编译错误,但它应该会产生逻辑问题,因为构造函数 name 的形参覆盖了对象变量 name 我们事先定义的。实际代码将是 this.name = name

除此之外,我没有发现 Person 类有任何问题。

“Student”类中的第一个错误是关键字expands,应该是extends。它应该会导致编译错误。

在构造函数Student中,我们写name = name。我不确定这是否会导致逻辑/编译错误。也许有人可以帮我解决这个问题?无论如何,我们应该在这里通过编写 super(name) 来调用父类(super class),因为父类(super class) Person 中已经给出了学生的 name .

再一次,我们要写this.Nr = Nr

最后但同样重要的是,我们不想返回 toString() + ...,因为,好吧,我猜这会调用方法 toString()无限频繁并导致堆栈溢出。

我错过了什么吗?

最佳答案

你的分析是正确的。

Student 的构造函数中你只遗漏了一个错误

public Student(String name, int Nr) {
    name = name;   
    Nr = Nr;
}

将其更改为

public Student(String name, int Nr) {
    this.name = name;   
    Nr = Nr;
}

将生成一个不可编译的代码,因为在父类(super class)中name是一个私有(private)字段,所以在类Student中是不可见的。

注意:虽然将变量 Nr 命名为大写 N 并不是错误,但它违反了变量命名的常见最佳实践。变量或方法应以小写字母开头。类或接口(interface)应以大写字母开头。


@Julian,不仅仅是写作

public Student(String name, int Nr) {
    super(name);
    this.Nr = Nr;
}

会起作用,但也是必要的。因为父类(super class)不公开默认构造函数。所以Student类需要显式调用父类(super class)的构造函数。

关于java - 在给定的代码块中查找错误(类的扩展,个人/学生),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42363743/

相关文章:

java - 在游戏中正确处理 Android 上的触摸输入

java - 带菜单的命令行 Java 程序

Java 删除 -> 编译时类型对齐 - 或 Java 库/框架代码转换为应用程序逻辑

php - 手动滚动 ORM 类——单例、静态父类?

c++ - OOP - 它是覆盖类成员变量类型的好方法吗

java - 当从 java 程序在 mongodb 中存储 long 值时,该值以这种格式存储 NumberLong(n)

java - DocuSign Java API EnvelopesApi.getDocument 返回 NULL 异常

Python 对象保留以前的数据?

python - 如何避免不小心弄乱Python中的基类?

c++ - 在 C++ 中, "class instance"是唯一的对象类型吗?