java虚方法调用_5.2 多态和虚方法调用:非虚的方法调用

我们知道呢,在java当中呢,普通的方法, 也就是说不用做特殊声明,它都是虚方法。也就是说,它会在调用的 时候,会根据实际的对象,实例,实际的这个实例来进行方法的 来决定判断哪个方法,也就是都是虚方法。 当然呢,也有呢不是虚方法的情况。那么这个不是虚方法的情况呢, 主要是static,private和final的方法,我们一个个来看。 这个static 它为什么不是虚方法呢?因为它属于类的,static,还有一种private, private呢因为它是这个类自己的,这个类自己它不会被, 因为子类是看不见的,所以子类也不可能override它。所以这样的话, static,final呢,以及与我们普通的那个虚方法呢,编译以后用的指令呢,是 不同的。我们下面看看这个例子。 看这个例子里面,有一个普通的方法, f,function,然后有个private方法p,然后有个 static方法s。那这三个方法呢我们都去调用它, f,private的方法,或static方法,去调用它,然后 我们把它编译, 编译以后呢,我们用Javap -c,我这里呢 用Javap呢来看,-c呢来返汇编一下,看看它的这个 指令。那这里的这个指令呢, 我们看一下。 这里呢,它是一个方法, f这个方法,f这个方法呢它编译成什么呢?就在这里呢,编译成invoke virtual,就是调用虚方法。那么这个, 这个呢是我们调用p,private的方法呢,它翻译成呢invoke special,啊special。然后再下面这个呢,static方法 它翻译成呢invokestatic,所以也就是说, 我们从Java里面写的那个不同的那个,那种方法呢, Java呢它翻译成不同的指令,所以呢,它内部呢是能够知道 去调用,怎么方式呢,这三种呢是不去 就是调用什么样的方法。也就是说,简单 地说呢,这种呢,虚方法调用呢,它是非虚的 方法调用,一个是static,我们讲呢,因为static呢,它与实例无关,所以- 你就没, 没有意义来说呢,它是什么实例,那就没有这个虚方法的 问题。它,它所有的方法是以声明的类型为准,也就是说, 你声明它是什么类型,它就是,就调什么类型的 这个static方法,跟你的实例无关,因为它翻译成呢 最终呢也翻译成这个类型的static方法。 private方法因为子类看不见,也不会存在这个 override的问题,所以它也不会被虚化。当然,final呢, 因为子类呢也不能覆盖它,所以也不存在虚化的问题。所以static,private,- final 都不会被虚化,也就是说,它都会以 这个类型为准,而不会以这个实际的这个 对象为准。下面我们看看这个例子。请看这个例子,这个例子呢, 我们有形状对象,它里面有一个static方法,这个static方法呢 然后我们Circle它又有static方法,这里又有static方法。 Triangle里面呢类似的,就是说我们子类里面有个 static方法。所以这个draw方法呢它就跟我们这个 实例无关了,static方法呢也就是跟那个类有关,跟那个 具体的哪一个形状,或哪一个圆是无关的。所以我们在调用的时候呢, 你会发现,比如说,我们这里呢有三个不同的实例,用这 三个不同的实例呢,然后我们去调这个do这个函数,这个函数里面调用了s.draw, 那这里呢,由于这个draw方法呢它是static方法所以呢, 它就不管你这是圆呢,还是三角形,还是其他形状,它只跟声明的类型有关, 这里呢是形状对象,所以它就直接绑定到形状,固定到形状这个do方法, 就跟你这三个无关了。所以这三个呢,它都是调到 形状的,所以它是调用了形状,跟那个实例无关, 跟那个形状的这个类有关。我们下面再看这个例子。 比如说我们有一个形状对象new circle,这是一个,这个circle实例,这个实例呢我们调用它,我们刚才提到了- 这个会, 它是一个,它是决定于我们声明的 这个形状,所以这里呢,它是调 形状对象的draw函数。这里呢,s.draw呢,它是 调形状的draw。如果我们有个圆,这里呢写个圆 c,那它就会调 这样的就会调这个圆的draw函数。也就是说,跟我们 因为静态方法呢,它跟这个,这个声明的类型有关,也就是在这里,它调的是 形状的draw方法,在这里呢,虽然它也是个圆,这两个都是圆,对吧? 它都是圆,但是呢,它由于这个是一个static方法,所以跟后面的这个 实例实际上是无关的,是跟这个声明的类型有关。 我们简单地说,static它是 非虚的,所以呢,它只跟声明的这个 类型有关,而跟最后面的 这个实例无关,所以这是我们在使用的时候呢要小心的地方。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值