java非静态方法为什么不能被子类覆盖为静态方法
2016-08-11 20:47
316 查看
我的理解static和普通方法是在不同内存的,当子类重写时为方法添加static时,jvm根本搞不清楚调用哪个
一直半解在网上搜到了一个前辈说的。我觉得挺深刻的
覆盖(override)是在继承+多态的前提下的概念。Java中的静态方法不多态,所以不涉及覆盖,无论静态方法是在基类还是派生类上。
从结果看,JVM中有4条invoke-*指令:invokevirtual、invokeinterface、invokestatic、invokespecial,其中前两条指令有多态语义而后两条没有。
静态方法是用invokestatic来调用的,编译的时候就确定好具体用那个版本的方法了。private的成员方法是用invokespecial调用的,同样不多态。被调用的变量是接口的引用时,调用方法是用invokeinterface。其余的情况的成员方法用invokevirtual。
一直半解在网上搜到了一个前辈说的。我觉得挺深刻的
覆盖(override)是在继承+多态的前提下的概念。Java中的静态方法不多态,所以不涉及覆盖,无论静态方法是在基类还是派生类上。
从结果看,JVM中有4条invoke-*指令:invokevirtual、invokeinterface、invokestatic、invokespecial,其中前两条指令有多态语义而后两条没有。
静态方法是用invokestatic来调用的,编译的时候就确定好具体用那个版本的方法了。private的成员方法是用invokespecial调用的,同样不多态。被调用的变量是接口的引用时,调用方法是用invokeinterface。其余的情况的成员方法用invokevirtual。
相关文章推荐
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 子类为什么不能重写父类的静态方法
- 异常父类为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- 为什么java静态方法不能调用普通方法?普通方法能调用静态方法?
- java中静态(static)的方法为什么不能重写(override)
- [转]Java静态方法为什么不能访问非静态方法
- Java静态方法为什么不能访问非静态方法
- java中静态方法不能被重写(覆盖)
- JAVA基础:子类、父类继承关系 静态块、非静态块、构造函数初始化顺序性、静态非静态方法覆盖
- Java静态方法为什么不能访问非静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- java为什么不能重写静态方法
- java中静态方法为什么不能调用非静态方法或者变量
- java静态方法的重写,为什么不能?
- 为什么JAVA中的属性不能覆盖而方法却可以覆盖
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
- java为什么不能在静态域或方法中引用类型变量?
- (java)父类的静态方法为子类覆盖后,丢失多态性的问题
- java中为什么静态方法不能访问非静态方法或者变量