我正在编写一个类方法来比较两个作者对象字段。
public int compareTo(Author b) {
int i = -2;
String afn = this.firstName;
String aln = this.lastName;
String bfn = b.firstName;
String bln = b.lastName;
if(afn.equals(bfn)) { i++; }
if(aln.equals(bln)) { i++; }
return i;
}
然而,当我使用不同的字符串传递一个author对象时,它仍然返回零。我的方法有问题吗?该方法还需要“这个”吗?
这是班级。
public class Author {
String firstName = TITLE_NOT_SET;
String lastName = TITLE_NOT_SET;
int birth = YEAR_NOT_SET;
int death = YEAR_NOT_SET;
public Author(String ln, String fn) {
String lastName = ln;
String firstName = fn;
}
public int getDeath() {
return death;
}
public int getBirth() {
return birth;
}
public void setDates(int b) {
if(b > 2018 || b < -2000) { b = birth; }
birth = b;
}
public void setDates(int b, int d) {
if(b > 2018 || b < -2000) { b = birth; }
if(d < b) { d = death; }
birth = b;
death = d;
}
public int compareTo(Author b) {
int i = -2;
String afn = this.firstName;
String aln = this.lastName;
String bfn = b.firstName;
String bln = b.lastName;
if(afn.equals(bfn)) { i++; }
if(aln.equals(bln)) { i++; }
return i;
}
public String toString() {
return lastName + ", " + firstName;
}
}
答案 0 :(得分:1)
您的代码中有一些错误。造成问题的直接原因是你的构造函数正在遮蔽实例变量,因此它们在构造时永远不会改变,就像你在测试类的toString方法时所看到的那样。
public Author(String ln, String fn) {
String lastName = ln; //Remove 'String'
String firstName = fn; //Remove 'String'
}
坚持我的风格,我会写这样的构造函数:
public Author(String lastName, String firstName) {
this.firstName = firstName; //Using the 'this' makes it clear to me exactly what I wish to happen...
this.lastName = lastName;
}
'阴影是更高范围的变量被阻止的地方,因为它与一个更近的范围中的一个共享它的名称(实际上通常是一个参数,但它可以是在那里声明的一个)。因为它们都使用相同的名称,所以使用具有最接近范围的名称以减轻歧义,您可以使用this
关键字来访问实例范围,或使用ClassName来访问静态变量。要记住的主要事情是,在声明变量时,编译器不一定会告诉您已隐藏变量,因为它可能是故意的,因此如果您重复使用名称,请确保您正在访问您希望的范围内的变量。也许更多帮助here ......