关于this, 在这里this代表什么?? 向上转型,属于动态绑定,因为你的derived是extends base 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 this一般指当前类,动态绑定,当前是derived 类,虽然它继承的base,但实际用的类是derived。 good question!我觉得关键就在super.equals(obj);它虽然调用啦父类的equals()方法,但仍然处于derived的调用环境中。因此它的this实际上是:derived JAVA中的动态绑定就是在向上转型中访问的依然是子类的方法,但是不能访问父类没有而子类扩展父类的方法 是调用啦父类的方法:我测试过。但这里的this是derived,这是跟调用环境相关 ==比较的是对象的引用,而你的equals函数。。 因为 class derived 中,重载了class base的equals方法,就是说,class derived 中的equals方法,被class base中的equals方法改写了,1处的this是derived。这就是Java多态性中的override.我这样讲不知你明不明白。 讲错了,应该是 base中的equals方法,被 derived 中的equals方法“重写”了。父类中的方法,可以被子类中的同名的方法所“改写”,这是就重载。 试验证明根重载没有关系!!!把derived的equals改个名字,比如equals123效果也一样。所以,感觉根重载,覆盖没有关系,应该跟继承有关。 因为你derived 继承base 在derived类中你用重写equals方法,所以this.getclass()当然就是指当前的类了(derived). //equ.javapublic 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 derived3应该是动态绑定 这里有没有java的有关这方面的原则性的论述呢? 这个继承实现与super.equals()有啥区别?this,反正就是当前对象的引用,无论在哪里. 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@720eebHello@3179c35Hello@720eebHello@3179c36truePress any key to continue...在这里表明你的程序中根本就没有执行你if else里面的语句;直接返回最后的结果true;其实什么也没做;(this,反正就是当前对象的引用,无论在哪里.)这句话就是你要的结果;在这里面this在子类的引用值为:=Hello@720eeb在父类中的引用值为:= Hello@3179c3这说明他们指的是同一个引用;也属于用一个class; 写错了;改正为this在子类的引用值为:=Hello@720eeb在父类中的引用值为:= Hello@720eeb这说明他们指的是同一个引用;也属于用一个class; 我觉得是动态绑定,在thinking in java中有详细的说明。 chshanhaojuan(无极) 分析的已经很清楚了 当执行super.equals(obj)的时候 实际上是带了二个参数 super.euqals(this,obj) 而此处的this就是hello1 所以在base类中的this也指向了hello1 this实际上就是得到当前所在类的句柄,可以通过这个句柄对它的属性和方法进行操作 我给你说一个::::::::::::::::::::::::::::::就是谁来调用,this就是谁,!!!!!!!记住没错! 如何将数据库里的数值转化为select 为什么我的JSF Tree2组件在IE6.0下显示不了 我的程序为什么会报说sysdatabases无效呢!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 提问:动态获取JAVA BEAN中的私有数据。 Java集合中如何解决数据分类汇总的问题(需要高手解决) 问个struts2的问题 对jsp标记扩展机制的一点看法! 小妹请各位SCJDgg帮个忙 SSH中如何用ajax验证添加的数据是否存在?? socket 请各位大虾请推荐几本书 性能分析工具是怎么做的??????
我觉得关键就在super.equals(obj);它虽然调用啦父类的equals()方法,但仍然处于derived的调用环境中。因此它的this实际上是:derived
我这样讲不知你明不明白。
把derived的equals改个名字,比如equals123效果也一样。
所以,感觉根重载,覆盖没有关系,应该跟继承有关。
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
应该是动态绑定
this,反正就是当前对象的引用,无论在哪里.
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;
this在子类的引用值为:=Hello@720eeb
在父类中的引用值为:= Hello@720eeb
这说明他们指的是同一个引用;
也属于用一个class;
当执行super.equals(obj)的时候 实际上是带了二个参数
super.euqals(this,obj) 而此处的this就是hello1
所以在base类中的this也指向了hello1
就是谁来调用,this就是谁,!!!!!!!
记住没错!