从java虚拟机层次理解this和static关键字

在《java编程思想》第5章 5.4 讲this关键字的时候,我注意到一句话

       ——“如果有同一个类型的两个对象,分别是a和b。你可能想知道,如何才能让着两个对象都能调用peel()方法呢”

Class Banana{
      void peel (int i){/*....*/}
}

当时看到这句话不知道它为什么会这么问,当时觉得理所当然的每个对象自然会调用自己对象内部所对应的方法,但是其实java虚拟机 的内部并非如此,所以才有如此一问。

java虚拟机的内部结构以及运行方式不再赘述。以后会编辑把关于java虚拟机的一些文章加在这里

java的对象是存在于堆(heap)中的,但是其实对象内容中并不包含如上面代码中的peel这种方法,因为对于多个对象来说放置相同的方法在每个对象里面是十分浪费的,java虚拟机的设计者从开始并没有打算这样放置,这个是我个人以前一直有的一个错误概念。

这个方法在被编译后应该以指令的形式被保存在内存中,当对象调用时会将自身引用带入这个方法中,这个方法会利用此引用取得此对象里面的其它的域或者其它方法的调用。


static的方法或者static的域,其实就是没有this引用的方法和不依赖于this就可以存在的域,这种方法以及域的存储显然不应该和非静态的东西在一个地方。他们在类被加载的时候就被初始化了,并不等待对象在堆栈上被初始化出来,更不需要它的引用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值