查看下面的例子:
public class Futher {
public static int a = 1;
public int b = 4;
public static int getA() {
return a;
}
public static void setA(int a) {
Futher.a = a;
}
public void sayHello(){
System.out.println("Fu Hello");
}
}
public class Child extends Futher {
public static int a = 2;
public int b = 5;
public static int getA() {
return a;
}
public static void setA(int a) {
Futher.a = a;
}
@Override
public void sayHello(){
System.out.println("Ch Hello");
}
}
public class DoMain {
public static void main(String[] args) {
Futher fu = new Child();
//调用静态变量
System.out.println(fu.a);
//调用静态方法
System.out.println(fu.getA());
}
}
输出:
1
1
我们查看编译后的主函数文件 .class 文件
public class DoMain {
public DoMain() {
}
public static void main(String[] args) {
Child fu = new Child();
System.out.println(Futher.a);
System.out.println(Futher.getA());
}
}
首先静态变量和静态方法不具备多态性,如果向上转型 用声明类型承接引用类型变量,利用变量调用静态变量或静态方法,编译器会在编译期间将其装换为 声明类的调用形式。
参考:
https://my.oschina.net/LucasZhu/blog/1648347