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