如下代码:class Person{
private String name;
private int age;
public Person(String name, int age){
this.setName(name);
this.setAge(age);
}
public boolean compare(Person per){
//调用此方法时里边存在两个对象:当前对象, 传入的对象
Person p1 = this; //表示当前调用方法的对象为per1
Person p2 = per2; //传递到方法中的对象,为per2
if(p1 == p2){ //首先比较两个地址是否相等
return true;
}
//分别判断每个属性是否相等
if(p1.name.equals(p2.name)&&p1.age == p2.age){
return true;
}else{
return false;
}
}....           //此处省略setter和getter代码
}
public class Demo {
public static void main(String[] args){
Person per1 = new Person("Riku",30);
Person per2 = new Person("Hiku",30);
if(per1.compare(per2)){ //进行对象比较
System.out.println("相等!");
}else{
System.out.println("不等!");
}
}
}
请问,用new关键字来实例化对象的时候,不是新建立了堆内存空间么?那么在对比的时候两者地址的时候怎么可能返回true值呢?
再有就是,主方法内的if(per2.compare(per2))和方法compare(Person per)中的调用关系我看不懂.值知道是将per1和per2分别调用到p1和p2里边了!可是具体的类图应该是怎样的?谢谢帮忙解答的大大!

解决方案 »

  1.   

    1、只要是new出来的是2个对象就不可能相等
    2、per1.compare(per2) 的意思是调用了per1这个对象的compare方法。传入的值是per2对象的引用
    3、你给的这段代码是不会编译通过的(Person p2 = per2;)
      

  2.   

    传进去的参数和原对象如果确实指向同一个对象,就可能了。如:
    Person p = new Person("Riku",30);
    p.compare(p) //此时==判断成立。
      

  3.   

    if(per1.compare(per2))
    这只是调用了per1对象上的compare方法,送进去的是per2参数。
    这只是方法调用,就不要上升到类图这个层面了。
      

  4.   

    可以主方法内是分别new了一个实例化对象!
      

  5.   

    用new那么就会新开辟内存空间来存放对象,所以用new产生的两个对象地址是不等的。
    Person p2 = per2这句有问题的,因为方法里面都不存在per2这个对象的定义,所以编译无法通过。
    改为:Person p2 = per;if(per2.compare(per2))和方法compare(Person per)
    前面一个是说用per2这个对象去调用他实例里面的compare方法,传入的参数是per2(即:把per2跟per2比较,自己跟自己比较当然在判断内存地址的时候就相等了撒)后面一个是方法的定义,定义一个名为compare的方法,需要传入的参数类型为Person
      

  6.   

    这里是完整代码.编译和执行都通过!
    /*
    了解this表示当前对象作用
     */
    class Person{
    private String name;
    private int age;
    public Person(String name, int age){
    this.setName(name);
    this.setAge(age);
    }
    public void setName(String n){
    name = n;
    }
    public void setAge(int a){
    age = a;
    }
    public String getName(){
    return name;
    }
    public int getAge(){
    return age;
    }
    public boolean compare(Person per){
    //调用此方法时里边存在两个对象:当前对象, 传入的对象
    Person p1 = per; //表示当前调用方法的对象为per1
    Person p2 = this; //传递到方法中的对象,为per2
    if(p1 == p2){ //首先比较两个地址是否相等
    return true;
    }
    //分别判断每个属性是否相等
    if(p1.name.equals(p2.name)&&p1.age == p2.age){
    return true;
    }else{
    return false;
    }
    }
    }
    public class Demo {
    public static void main(String[] args){
    Person per1 = new Person("Riku",30);
    Person per2 = new Person("Hiku",30);
    if(per2.compare(per1)){ //进行对象比较
    System.out.println("相等!");
    }else{
    System.out.println("不等!");
    }
    }
    }
      

  7.   

    是的,我输入错了!是Person p2 = per;
    但是后边一个语句是if(per1.conpare(per2))而不是per2.compare(per2)).比是per2和per2比较,而是per1和per2相比较!
      

  8.   

    你把Person per2 = new Person("Hiku",30);
    里的name值改成和上边一样就相等了!
      

  9.   

    那个,我知道!
    方法compare中的判断句式是先判断地址是否相同,如果不同再向下判断每个属性是否相等!而不是判断地址返回的true值!谢谢大家...