向上转型,属于动态绑定,因为你的derived是extends base

解决方案 »

  1.   

    this一般指当前类,动态绑定,当前是derived 类,虽然它继承的base,但实际用的类是derived。
      

  2.   

    good question!
    我觉得关键就在super.equals(obj);它虽然调用啦父类的equals()方法,但仍然处于derived的调用环境中。因此它的this实际上是:derived
      

  3.   

    JAVA中的动态绑定就是在向上转型中访问的依然是子类的方法,但是不能访问父类没有而子类扩展父类的方法
      

  4.   

    是调用啦父类的方法:我测试过。但这里的this是derived,这是跟调用环境相关
      

  5.   

    ==比较的是对象的引用,而你的equals函数。。
      

  6.   

    因为 class derived 中,重载了class base的equals方法,就是说,class derived 中的equals方法,被class base中的equals方法改写了,1处的this是derived。这就是Java多态性中的override.
    我这样讲不知你明不明白。
      

  7.   

    讲错了,应该是 base中的equals方法,被 derived 中的equals方法“重写”了。父类中的方法,可以被子类中的同名的方法所“改写”,这是就重载。
      

  8.   

    试验证明根重载没有关系!!!
    把derived的equals改个名字,比如equals123效果也一样。
    所以,感觉根重载,覆盖没有关系,应该跟继承有关。
      

  9.   

    因为你derived 继承base 在derived类中你用重写equals方法,所以this.getclass()当然就是指当前的类了(derived).
      

  10.   

    //equ.java
    public class equ 
    {
    public static void main(String[] args) 
    {
    derived d1 = new derived();
            derived d2 = new derived();
            System.out.println(d1.bequals(d2));
    }
    }
    class base {
        public String bequals(Object obj) {
            if (this == obj) return "1";
            if (this.getClass() != obj.getClass()) return "2";     // 1        
            System.out.println(this.getClass());
    return "3";
        }
    }class derived extends base {
        public String bequals(Object obj) {
            if (this == obj) return "4";        
    if (this.getClass() != obj.getClass()) return "5";
    return super.bequals(obj);                            // 2
    }}运行结果:
    class derived
    3
    应该是动态绑定
      

  11.   

    这里有没有java的有关这方面的原则性的论述呢?
      

  12.   

    这个继承实现与super.equals()有啥区别?
    this,反正就是当前对象的引用,无论在哪里.
      

  13.   

    class base {
        public boolean equals(Object obj) 
        {
         System.out.println(this);
         System.out.println(obj);
            if (this == obj)
            {
             System.out.println("3");
              return true;
            }
            if (this.getClass() != obj.getClass())
            { 
             System.out.println("4");
             return false;     // 1
        }
        System.out.println("6");
            return true;
        }
    }public class Hello extends base {
        public boolean equals(Object obj) {
         System.out.println(this);
         System.out.println(obj);
            if (this == obj) 
            {
             System.out.println("1");
             return true;
            }
            if (this.getClass() != obj.getClass())
            {
             System.out.println("2");
              return false;
            }
            System.out.println("5");
            return super.equals(obj);                               // 2
        }
        public static void main(String[] args)
        {
         Hello hello1 = new Hello();
         Hello hello2 = new Hello();
         System.out.println(hello1.equals(hello2));
        }
    }
    输出的结果是
    Hello@720eeb
    Hello@3179c3
    5
    Hello@720eeb
    Hello@3179c3
    6
    true
    Press any key to continue...
    在这里表明你的程序中根本就没有执行你if else里面的语句;
    直接返回最后的结果true;
    其实什么也没做;
    (this,反正就是当前对象的引用,无论在哪里.)这句话就是你要的结果;
    在这里面
    this在子类的引用值为:=Hello@720eeb
    在父类中的引用值为:= Hello@3179c3
    这说明他们指的是同一个引用;
    也属于用一个class;
      

  14.   

    写错了;改正为
    this在子类的引用值为:=Hello@720eeb
    在父类中的引用值为:= Hello@720eeb
    这说明他们指的是同一个引用;
    也属于用一个class;
      

  15.   

    我觉得是动态绑定,在thinking in java中有详细的说明。
      

  16.   

    chshanhaojuan(无极) 分析的已经很清楚了 
     当执行super.equals(obj)的时候 实际上是带了二个参数
     super.euqals(this,obj) 而此处的this就是hello1
     所以在base类中的this也指向了hello1
      

  17.   

    this实际上就是得到当前所在类的句柄,可以通过这个句柄对它的属性和方法进行操作
      

  18.   

    我给你说一个::::::::::::::::::::::::::::::
    就是谁来调用,this就是谁,!!!!!!!
    记住没错!