今天看到了Java中⼦类继承⽗类的⼀个相关讨论,在⽹上综合了各家的观点,写下了⼀篇简短的总结。问题如下,在⽗类中含有staic修饰的静态⽅法,那么⼦类在继承⽗类以后可不可以重写⽗类中的静态⽅法呢?答案是:不能。
很多⼈可能会提出疑问,因为他们在写代码的时候出现过以下代码,举例:⽗类:Animal.java
public class Animal {
public Animal() { }
public void run() {
System.out.println(\"动物可以奔跑\"); }
public static void shout() {
System.out.println(\"动物可以叫\"); } }
⼦类:Dog.java
public class Dog extends Animal {
public Dog() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
dog.shout(); }
@Override
public void run() {
System.out.println(\"狗跑得很快\"); }
public static void shout() {
System.out.println(\"狗的叫声是汪汪汪\"); } }
运⾏Dog.java结果:
这是不是说明⼦类实现了对⽗类中静态⽅法的重写呢?貌似很有道理,然⽽我们对Dog.java,稍作改动,即将dog向上转型:
public class Dog extends Animal {
public Dog() {
// TODO Auto-generated constructor stub }
public static void main(String[] args) {
Animal dog = new Dog();
dog.run();
dog.shout(); }
@Override
public void run() {
System.out.println(\"狗跑得很快\"); }
public static void shout() {
System.out.println(\"狗的叫声是汪汪汪\"); } }
运⾏结果:
说明⼦类其实并没有实现对⽗类stati⽅法的重写,为什么?
在Java中,如果⽗类含有⼀个静态⽅法,且在⼦类中也含有⼀个返回类型,⽅法名、参数列表等都与之相同的的静态⽅法,在⼦类中只是对⽗类的该同名⽅法进⾏隐藏,并不是重写。⽗类与⼦类含有的其实是两个没有关系的⽅法,两者的⾏为不具有多态性。
在上⾯的例⼦中,shout⽅法与类发⽣了关联,⽽不是与特定的类的实例相关联,它不在乎什么类型的类正在创建它,⽽仅仅在意引⽤的类型。在Animal dog = new Dog()中,dog是⼀个类Dog在内存中的⼀个Animal类型的引⽤,如果⼀个static⽅法被调⽤了,jvm不会检查什么类型正在指向它,他只会调⽤跟Anima类相关联的⽅法的实例。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务