A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ぺsimon☆ 中级黑马   /  2013-4-16 00:30  /  1415 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ぺsimon☆ 于 2013-4-16 23:29 编辑
  1. class demo   //定义一个demo类
  2. {        
  3.         private int num;  
  4.         demo(int num)  //构造函数初始化
  5.         {
  6.         this.num=num;  //对num进行赋值
  7.         }
  8.         public boolean equals(Object obj) //定义一个equals比较功能
  9.         {
  10.         if(!(obj instanceof demo)) //判断0bj是否包含demo
  11.                 return false;   
  12.         demo de=(demo)obj;  //类型转换
  13.         [color=Red]return this.num==de.num;[/color]
  14.         }
  15. }

  16. class demoEquals
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.         demo d1=new demo(2);
  21.         demo d2=new demo(3);
  22.         System.out.print(d1.equals(d2));
  23.         }
  24. }
复制代码
疑问:
1   obj instanceof demo   这句代码的意思是?object不是所有类的父类吗,还用判断?

2  return this.num==de.num;   如果这句写成是return this.num==num;    右边的num会调用那个,这句代码在内存里面是怎么运行的呢?

谢谢各位兄弟

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 沈浩 于 2013-4-16 01:29 编辑

public boolean equals(Object obj)这里的Object obj是父类的引用用于接收子类对象   就是因为object是所有类的父类  这是多态的体现  提高扩展性
obj instanceof demo   这句就是说判断obj这个对象是否是demo类的实例
2  return this.num==de.num;   如果这句写成是return this.num==num;  那当然是true啦  这个num在默认情况下会先看局部局部有就是局部的没有那就是同名成员变量
在此代码中就是   return this.num==this.num的意思

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
回答:
1.首先来看instanceof的含义,是Java、php的一个二元操作符,和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用在继承中的子类的实例是否为父类的实现、
其次我们从demo的功能来看,一个equals比较功能,他的第一个判断,判断是否是相同类型,如果不不是相同类型那么返回false。
2.return this.num==de.num;   如果这句写成是return this.num==num,那么虚拟机会认为是return this.num==this.num呢,也就是永远为true,调用的是内部类的num 如果没有类的转换,这部是错误的,因为Object中没有num这个域。
总结:我的理解就是这样的,自己也不是太明朗,希望您能明白!期待楼下补充,正解!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈宇鹏 于 2013-4-16 12:20 编辑

1,
  1. public boolean equals(Object obj) //定义一个equals比较功能
  2.         {
  3.         if(!(obj instanceof demo)) //判断0bj是否包含demo
  4.                 return false;   
  5.         demo de=(demo)obj;  //类型转换
  6.         return this.num==de.num;
复制代码
首先,第一行的意思是,从外部获取一个Object类的数据,因为Object是所有类的父类,也就是说,任何数据都可以。将其存入obj这个变量中。
然后看第三行,因为获取的这个数据被放入obj中,所以要判断obj是否数据demo 这个类
如果不属于,那么就返回fasle
是 就跳过,执行下一句类型转换


2  return this.num==de.num;   如果这句写成是return this.num==num;    右边的num会调用那个,这句代码在内存里面是怎么运行的呢?

这个时候,在主函数中,这一句是被d1所调用,所以这个时候,this.num 和num都是d1的数据。
所以必须要写de来声明和this.num(也就是d1.num)对比的是de这个对象的num。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
山西_李帅 来自手机 中级黑马 2013-4-16 12:33:44
报纸
第一个问题,因为你得代码没全,我估计是一个方法它接受的参数类型是object的,你写的obj应该是指你接收的参数。而不是那个超类,也就是说判断接受进来的参数是不是属于demo类型。
第二个问题,教你一个小方法,当你分不清name和this.name所代表的含义时,那就打印它。System.out.println(name);
相信你一定会发现这个方法太好用了。
回复 使用道具 举报
明白了谢谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马