为了账号安全,请及时绑定邮箱和手机立即绑定

关于java中继承静态方法的问题

关于java中继承静态方法的问题

30秒到达战场 2019-03-13 14:15:02
Base父类代码如下public class Base {    public static String showme(){        return "Base";    }    public void print(){        System.out.println(showme());    }}Sub子类代码如下public class Sub extends Base {    public static String showme(){        return "Sub";    } } main函数如下public class AppMain {    public static void main(String args[]){        Base base=new Sub();        base.print();        Sub sub=new Sub();        sub.print();        }}打印结果两个都为Base请问怎样解释在print方法中showme()方法的调用与什么有关?
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

对于静态方法而言使用的是 invokestatic 指令调用,invokestatic 指令并不需要实例引用作为操作数,只需要静态方法的符号引用,所以静态方法在编译期就已经指定了,print 方法的部分字节码:


GETSTATIC java/lang/System.out : Ljava/io/PrintStream;

INVOKESTATIC com/kyle/Base.showme ()Ljava/lang/String;

INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V

可以看到,invokestatic 就已经指定了调用的是 Base.showme,所以你如何调用 print 方法都不会改变 invokestatic 的行为。

另外,我感觉题主对静态绑定与动态绑定的理解有误,建议题主参阅这个问题:Java,在构造器里调用多态方法


查看完整回答
反对 回复 2019-04-23
?
墨色风雨

TA贡献1853条经验 获得超6个赞

子类可以继承父类的静态属性和静态方法,但是不可以重写静态方法。
在子类中有一个与父类具有相同方法标签(方法名相同,参数类型相同,返回值类型相同,甚至连访问级别也相同),也只能说明是对子类又新建了一个与父类同名的静态方法,而不是对父类的静态方法的重写.

查看完整回答
反对 回复 2019-04-23
?
手掌心

TA贡献1942条经验 获得超3个赞

print方法部分字节码


GETSTATIC java/lang/System.out : Ljava/io/PrintStream;

**INVOKESTATIC** com/kyle/**Base.showme ()**Ljava/lang/String;

INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V

方法调用以及明白的指定了是Base.showme()了


查看完整回答
反对 回复 2019-04-23
  • 3 回答
  • 0 关注
  • 320 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信