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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 窝牛。 中级黑马   /  2014-4-26 12:23  /  1377 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 窝牛。 于 2014-4-28 09:23 编辑

class Demo
{
        private int num;
        Demo(int num)
        {
                this.num=num;
        }
        public boolean equals(Object obj)
        {
               
                Demo d=(Demo)obj;
                return this.num==d.num;
        }
}

class Person
{
}

class  ObjectDemo
{
        public static void main(String[] args)
        {
                Demo d1=new Demo(4);
                Demo d2=new Demo(5);
                Person p=new Person(6);
                System.out.println(d1.equals(p));
        }
}
Objcet是所有类的父类,应该说Person也继承了Objcet类..Person类中也有equals方法啊.为什么传p去那却不能向下转型,不能比较值地址是否相同呢?
求大神科普.......谢谢了...................

6 个回复

倒序浏览
  1.     Demo d=(Demo)obj;
复制代码

obj凭什么能强制转换成Demo?Person又凭什么能强制转换成Demo,根本没有道理嘛。
回复 使用道具 举报
你怎么能把 Person类型转换成 Demo呢?  这是完全不相同的两个类型嘛,当然他们的父类都是Object  像你这样那不是天下类都可以相互转换了?
还有 父类引用是不能转换成子类的.会报错  只能子类转换成父类
回复 使用道具 举报
class Demo {
        private int num;
        Demo(int num) {
                this.num = num;
        }
        public boolean equals(Object obj) {
                Demo d = (Demo) obj;
                return this.num == d.num;
        }
}
class Person {
}
class ObjectDemo {
        public static void main(String[] args) {
                //创建Demo类的对象d1,调用构造函数Demo(int num),此时d1这个引用所对应的num值为4
                Demo d1 = new Demo(4);
               
                //创建Demo类的对象d2,调用构造函数Demo(int num),此时d2这个引用所对应的num值为5
                Demo d2 = new Demo(5);
               
                //这句话报错,因为Person类中并没有输入整形参数的构造方法
                Person p = new Person(6);
               
                /*
                 * 即使上句代码是正确的,那么p是Person类的一个对象
                 * 虽然Person类和Demo类都默认继承于Object这个基类
                 * 虽然根据多态的原理d1和p都被向上转型为Object类型的引用,
                 * 但d1是根据Demo类创建的对象,p是根据Person类创建的对象
                 * 而且Person和Demo这两个类是没有关系的,不存在任何继承关系
                 *
                 * 所以您这段代码中想把Person类创建的类型为Object类型的引用p,
                 * 强制类型转换成Demo类的类型是做不到的
                 */
                System.out.println(d1.equals(p));
        }
}

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  Person p=new Person(6);这句话会报错的,Person类没有对应的构造方法。
  1.   public boolean equals(Object obj)
  2.         {
  3.                
  4.                 Demo d=(Demo)obj;
  5.                 return this.num==d.num;
  6.         }
复制代码

这个方法,Object  obj 这是个方法的参数这是说明这个方法可以接收任何类对象,可是呢你用了一个类转型,在多态中常见,这种你能是子类转父类引用的情况,可是你的这个方法你确定是否传递Demo的父类你有可能会吧与Demo类没有关系的类给传进来,你看你就传进去了一个和Demo没有一丝关系的Person类,你怎么让它转,你这样写实际上就相当于Demo d = (Demo)P,这是一个很大的错误。。。
回复 使用道具 举报
倪大大 发表于 2014-4-26 13:55
你怎么能把 Person类型转换成 Demo呢?  这是完全不相同的两个类型嘛,当然他们的父类都是Object  像你这样那 ...

谢谢,明白了..非常详细.
回复 使用道具 举报
  1. class Demo
  2. {
  3.         private int num;
  4.         Demo(int num)
  5.         {
  6.                 this.num=num;
  7.         }
  8.         public boolean equals(Object obj)
  9.         {
  10.                
  11.                 Demo d=(Demo)obj;
  12.                 return this.num==d.num;
  13.         }
  14. }

  15. class Person extends Demo;//xiugaihou
  16. {
  17. }

  18. class  ObjectDemo
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Demo d1=new Demo(4);
  23.                 Demo d2=new Demo(5);
  24.                 Person p=new Person(6);
  25.                 System.out.println(d1.equals(p));
  26.         }
  27. }//自己定义的Demo类没有和Person类明确继承关系。虽然Object是所有类的父类,但是子类之间是不存在关系的
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马