从作者类比较两个作者对象的方法

时间:2013-11-06 01:03:38

标签: java class variables methods string-comparison

我正在编写一个类方法来比较两个作者对象字段。

 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;
  }

}

1 个答案:

答案 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 ......