先来看一段代码
/*** Created by bjchengpeng on 2018/7/19.*/
/**
运行结果* woof
* woofaa
*
* woof
* Basenjiaa
*
* Basenji
* Basenjiaa*/
public classBark {public static voidmain(String[] args) {
Dog woofer= newDog();
Dog nipper= newBasenji();
Basenji child= newBasenji();
woofer.bark();
woofer.aa();
System.out.println();
nipper.bark();
nipper.aa();
System.out.println();
child.bark();
child.aa();
}
}classDog {public static voidbark() {
System.out.println("woof");
}public voidaa() {
System.out.println("woofaa");
}
}class Basenji extendsDog {public static voidbark() {
System.out.println("Basenji");
}public voidaa() {
System.out.println("Basenjiaa");
}
}
对于static修饰的变量,当子类与父类中存在相同的static变量时,也是根据“静态引用”而不是根据“动态引用”来调用相应的变量的。
而在父类和子类中对于非static变量和方法,是根据“动态引用”来调用相应的变量和方法。
然而,接着会有这样的问题存在:java中 子类会不会继承父类的static变量和static方法
1)先说static方法:子类会不会继承父类的static方法呢??答案是:不会的,但是是可以访问的。
看如下的代码
public classParent {public static voidstaticMethod(){
System.out.println("Parent staticMethod run");
}
}public class Son extendsParent {//...
}
测试类
packagecom.wrh.teststaticmethod;public classTest {public static voidmain(String[] args) {
Parent child=newSon();
child.staticMethod();//输出:Parent staticMethod run
Son s=newSon();
s.staticMethod();//输出:Parent staticMethod run
}
}
运行结果如下
Parent staticMethod run
Parent staticMethod run
从上面的运行结果可以看出,static方法是可以被子类访问的。
2)接着来看父类的static修饰的变量,是否能够被子类继承呢??
答案:也是不可以的。但是也是可以被子类访问的。
小结
1)子类是不继承父类的static变量和方法的。因为这是属于类本身的。但是子类是可以访问的。
2)子类和父类中同名的static变量和方法都是相互独立的,并不存在任何的重写的关系。
参考 https://blog.csdn.net/u010412719/article/details/49254017 Java中子类是否可以继承父类的static变量和方法而呈现多态特性