static修饰方法--向上转型调用静态方法的特别之处(反常规)
2017-04-01 21:09
288 查看
比较下面代码输出结果(实际开发中不会遇到,只是在找工作时可能会遇到)
输出结果为:Child
输出结果为:Parent
为什么加static修饰方法后结果就变不一样了呢?
Java教程中这样解释的:子类可以继承父类的静态方法,但是子类不能重写父类的静态方法。在这种情况下子类怎么办呢,子类隐藏(术语hidden)了父类的静态方法,因为子类没法重写,所以当p是Parent引用类型时,调用的就是Parent类里的output()方法,而不是Child类里的output()方法,因为Child类里没有重写output()方法,意思等价于Child类里根本没有父类版本的output()方法(Child里的output和Parent里的output方法是不同的方法,这样理解)。如下代码可以证明子类没有重写父类静态方法(方法是加上@Override表示要重写,但是会编译报错)。
编译结果如下:
public class StaticTest { public static void main(String[] args) { Parent p = new Child(); p.output(); } } class Parent { public void output() { System.out.println("Parent"); } } class Child extends Parent { public void output() { System.out.println("Child"); } }
输出结果为:Child
public class StaticTest { public static void main(String[] args) { Parent p = new Child(); p.output(); } } class Parent { public static void output() { System.out.println("Parent"); } } class Child extends Parent { public static void output() { System.out.println("Child"); } }
输出结果为:Parent
为什么加static修饰方法后结果就变不一样了呢?
Java教程中这样解释的:子类可以继承父类的静态方法,但是子类不能重写父类的静态方法。在这种情况下子类怎么办呢,子类隐藏(术语hidden)了父类的静态方法,因为子类没法重写,所以当p是Parent引用类型时,调用的就是Parent类里的output()方法,而不是Child类里的output()方法,因为Child类里没有重写output()方法,意思等价于Child类里根本没有父类版本的output()方法(Child里的output和Parent里的output方法是不同的方法,这样理解)。如下代码可以证明子类没有重写父类静态方法(方法是加上@Override表示要重写,但是会编译报错)。
public class StaticTest { public static void main(String[] args) { Parent p = new Child(); p.output(); } } class Parent { public static void output() { System.out.println("Parent"); } } class Child extends Parent { //加上注解后编译会报错,证明子类没有重写父类方法,若去掉static,编译不会报错 @Override public static void output() { System.out.println("Child"); } }
编译结果如下:
StaticTest.java:20: 错误: 方法不会覆盖或实现超类型的方法 @Override ^ 1 个错误
相关文章推荐
- 向上转型调用静态方法答疑
- 为什么static修饰的方法能不能调用非static方法和属性,请讲详细点
- static静态属性和静态方法的原理与调用技巧
- php面向对象中static静态属性和静态方法的调用
- php static 静态方法 调用类的变量
- 向上转型之后的方法调用问题
- PHP中静态(static)调用非静态方法详解
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
- PHP中静态(static)调用非静态方法详解
- php面向对象中static静态属性和静态方法的调用
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
- php面向对象中static静态属性和静态方法的调用
- static修饰的变量和方法直接用类进行调用,不需要先用new创建新的方法就能调用
- static静态属性和静态方法的原理与调用技巧
- 在static方法中调用非静态方法?
- [gkk传智]static与多态及向下向上转型,及多态调用总结
- java向上转型方法调用的问题
- 抽象的(abstract)方法 是否可同时是 静态的(static),是否可同时是 本地方法(native),是否可同时被 synchronized修饰?
- 数据访问类用静态方法。。。当多个人调用时返回值会返回别人的?。。。特别奇怪的问题???
- php面向对象中static静态属性和静态方法的调用