为什么Java中子类对象和父类对象的hashcode相同?

Alan_Xiang
博客专家认证
2016-09-19 11:18:16
class A{
public A(){
System.out.println("father's hashcode : "+this.hashCode());
}
}

class B extends A{
public B(){
System.out.println("child's hashcode : "+this.hashCode());
}
}
public class test{
public static void main(String[] args){
new B();
}
}


输出是:

father's hashcode : 1043390835
child's hashcode : 1043390835


上述代码应该是分别输出父类对象和子类对象的hashcode,hashcode不应该是和内存相关的吗,那么这两个对象的hashcode怎么会相同呢?望大神解答,感激不尽。
...全文
561 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
木子木泗 2017-04-16
  • 打赏
  • 举报
回复
引用 1 楼 baidu_33235629 的回复:
this: 这个关键字始终代表的是调用者,如下伪代码: A类有方法hashCode(){ System.out.println( this.hashCode());} 创建对象a后 调用:a.hashCode(),其中this就是代表a 在上面代码中,new一个子类的对象时会调用子类中对应的构造方法,在编译后生成.class文件中子类的构造方法会有点变动对应的java代码如下: public B(){ super(); System.out.println("child's hashCode:" + this.hashCode()); } 这里所加的super();是调用了父类中的构造方法,但是这个父类的构造方法并不是由父类的对象调用的,而是由子类的对象b(注意一个对象在内存中代表一段空间,在创建对象的第一步就是分配空间,生成hash码值,再从创建对象到调用构造函数的过程中虚拟机肯定还做了很多工作)调用构造方法,在执行构造方法的过程中由调用了父类的构造方法,整个过程中并没有创建父类的任何对象,所以调用者还依旧是b对象整个执行的过程中的两个this指针都是对象b,所以最终的hashcode是一样的(为什么在子类对象能调用父类的构造方法而其非子类之间没办法调用? 因为java继承的这个功能就是这样设计的,到此就可以点到为止,等楼主的功力更上几层楼时在去深入研究JVM) 再方法执行的过程中可能会调用其他方法,可能会通过其他对象调用其他方法,也可能通过其他手段如super关键字来调用父类的方法,但this代表的始终是方法的调用者,只有通过对象调用带有this关键字的方法,this才会代表这个对象,否则代表的还是以前的那个对象
受教了
Alan_Xiang 2016-09-21
  • 打赏
  • 举报
回复
引用 1 楼 baidu_33235629 的回复:
this: 这个关键字始终代表的是调用者,如下伪代码: A类有方法hashCode(){ System.out.println( this.hashCode());} 创建对象a后 调用:a.hashCode(),其中this就是代表a 在上面代码中,new一个子类的对象时会调用子类中对应的构造方法,在编译后生成.class文件中子类的构造方法会有点变动对应的java代码如下: public B(){ super(); System.out.println("child's hashCode:" + this.hashCode()); } 这里所加的super();是调用了父类中的构造方法,但是这个父类的构造方法并不是由父类的对象调用的,而是由子类的对象b(注意一个对象在内存中代表一段空间,在创建对象的第一步就是分配空间,生成hash码值,再从创建对象到调用构造函数的过程中虚拟机肯定还做了很多工作)调用构造方法,在执行构造方法的过程中由调用了父类的构造方法,整个过程中并没有创建父类的任何对象,所以调用者还依旧是b对象整个执行的过程中的两个this指针都是对象b,所以最终的hashcode是一样的(为什么在子类对象能调用父类的构造方法而其非子类之间没办法调用? 因为java继承的这个功能就是这样设计的,到此就可以点到为止,等楼主的功力更上几层楼时在去深入研究JVM) 再方法执行的过程中可能会调用其他方法,可能会通过其他对象调用其他方法,也可能通过其他手段如super关键字来调用父类的方法,但this代表的始终是方法的调用者,只有通过对象调用带有this关键字的方法,this才会代表这个对象,否则代表的还是以前的那个对象
谢谢解答 ! 解释得很清楚!
baidu_33235629 2016-09-20
  • 打赏
  • 举报
回复
这个过程中只是通过子类对象调用了类父类的方法并没有创建父类的对象,只创建了一个子类的对象 建议楼主将this代表的含义具体了解下 共勉
baidu_33235629 2016-09-20
  • 打赏
  • 举报
回复
this: 这个关键字始终代表的是调用者,如下伪代码: A类有方法hashCode(){ System.out.println( this.hashCode());} 创建对象a后 调用:a.hashCode(),其中this就是代表a 在上面代码中,new一个子类的对象时会调用子类中对应的构造方法,在编译后生成.class文件中子类的构造方法会有点变动对应的java代码如下: public B(){ super(); System.out.println("child's hashCode:" + this.hashCode()); } 这里所加的super();是调用了父类中的构造方法,但是这个父类的构造方法并不是由父类的对象调用的,而是由子类的对象b(注意一个对象在内存中代表一段空间,在创建对象的第一步就是分配空间,生成hash码值,再从创建对象到调用构造函数的过程中虚拟机肯定还做了很多工作)调用构造方法,在执行构造方法的过程中由调用了父类的构造方法,整个过程中并没有创建父类的任何对象,所以调用者还依旧是b对象整个执行的过程中的两个this指针都是对象b,所以最终的hashcode是一样的(为什么在子类对象能调用父类的构造方法而其非子类之间没办法调用? 因为java继承的这个功能就是这样设计的,到此就可以点到为止,等楼主的功力更上几层楼时在去深入研究JVM) 再方法执行的过程中可能会调用其他方法,可能会通过其他对象调用其他方法,也可能通过其他手段如super关键字来调用父类的方法,但this代表的始终是方法的调用者,只有通过对象调用带有this关键字的方法,this才会代表这个对象,否则代表的还是以前的那个对象

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧