java定义类里重写equals方法的问题

publicbooleanequals(Objecto){if(oinstanceofPerson){Persona=(Person)o;if(this.name.equ... public boolean equals(Object o)
{
if(o instanceof Person)
{
Person a=(Person)o;
if(this.name.equals(a.name)&&this.age==a.age)//这个this 是调用本方法的对象 是Object类引用
{
return true;
}
}
return false;
}
这个this在主程序里是Object类的引用 为什么他可以调用name成员变量呢 不是说父类引用指向子类对象是不能访问子类里的独有成员吗 他又没进行过向下转型 而形参传递过来的对象同样是Object类的引用 为什么他就必须要向下转型才能调用name呢
是重写的Person类的equals
主程序在这
public class Test
{
public static void main(String[] args)
{
Object obj=new Person("sd",2);
Person p=new Person("sd",2);
System.out.println(obj.equals(p));
}
}
obj就是这个this是吧 他是父类引用 为什么在重写的equals()里可以直接访问子类成员name 而不用向下转型呢
展开
 我来答
armslave88
推荐于2017-12-15 · TA获得超过416个赞
知道小有建树答主
回答量:535
采纳率:100%
帮助的人:460万
展开全部
this代表的是Person类,当前类的对象;父类引用指向子类对象是不能访问子类里的独有成员这个没有错。

o是形参,转之前先进行了判断,符合条件后才强转转成Person类,然后进行比较
下面的是标准写法,供你参考
通常自己的类里面这样重写equals方法,如果重写equals,则必须重写hashcode方法
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Share other = (Share) obj; // 换成你自己的类
if (cn_share_id == null) {
if (other.cn_share_id != null) // 要比较的成员
return false;
} else if (!cn_share_id.equals(other.cn_share_id))
return false;
return true;
}
巫难天地难m
推荐于2016-04-12 · TA获得超过263个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:136万
展开全部

你要知道每一个类里面的this到底是什么意思?你的理解是错误的!注意:对于继承过的类!这些有继承关系的类里面的this都是代表着最后一个new出对象时的那个对象!我写了3个类!你看看结果就知道了!

Person类

package question;
public class Person {
 private int uid;
 private String name;
 
 public Person() {
  super();  //这里是Object类默认构造函数
  System.out.println("当前对象的简单名:"+this.getClass().getSimpleName());
  System.out.println("当前对象的复杂名:"+this.getClass().getName());
 }
}
Student类
package question;

public class Student extends Person {
 private String stu_id;
 public Student() {
  super();  //Person构造函数
  System.out.println("当前对象的简单名:"+this.getClass().getSimpleName());
  System.out.println("当前对象的复杂名:"+this.getClass().getName());
  
 }
}

Test类

package question;
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  new Student();
 }
}

 

测试结果:
当前对象的简单名:Student
当前对象的复杂名:question.Student
当前对象的简单名:Student
当前对象的复杂名:question.Student

第二个关于Object就不讲了!

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
302652034_bai
2015-02-17 · TA获得超过4145个赞
知道大有可为答主
回答量:2206
采纳率:66%
帮助的人:1545万
展开全部
问题是,你是重写哪个类的equals方法咯,你既然是重写Person类的equals的话,this又这么会是Object的引用呢?
this指的是当前类对象的实例,既然this指的是Person的话,有为什么不能访问name呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式