成员变量不具有多态性,请看下面的例子:

public class Super {

	public int field = 0;

	public int getField() {
		return field;
	}

}
public class Sub extends Super {

	public int field = 1;

	public int getField() {
		return field;
	}
	
	public int getSuperField() {
		return super.field;
	}
	
}
public static void main(String[] args) {
		Super sup = new Sub();
		System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
		Sub sub = new Sub();
		System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField()
				+ ", sub.getSuperField() = " + sub.getSuperField());
	}

输出结果:

sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0

本例中,Super 和 Sub 各有一个成员变量 field,当 Sub 继承 Super 后,Sub 实际包含两个名为 field 的成员变量:一个是它自己的,还有一个是从 Super 那里继承得来的。尽管这两个成员变量的名字相同,但是它们不是同一个变量,因为它们在内存中分配了不同的存储空间。当 Sub 对象向上转型为 Super 引用时,任何成员变量的访问操作都将由编译器解析。所以使用 Super 类型的引用访问 field 变量时,指向的是 Super 类中的 field。同理,使用 Sub 类型的引用访问 field 变量时,指向的是 Sub 类中的 field。你如果想访问从 Super 那里继承来的 field 时,必须使用 super 关键字,显示地调用 suepr.field。

虽然这看起来有些混淆,但是实际中,这些问题是不会发生的。首先,你通常会将所有的成员变量的访问权限都设置成 private,因此你无法直接访问它们,而是通过提供的 get 方法访问。另外,你通常不会对子类和父类的变量设置相同的名字,因为这种做法本身就容易令人混淆。

静态方法也不具有多态性,请看下面的例子:

public class Super {

	public static String staticGet() {
		return "Super staticGet()";
	}
	
	public String dynamicGet() {
		return "Super dynamicGet()";
	}

}
public class Sub extends Super {
	
	public static String staticGet() {
		return "Sub staticGet()";
	}
	
	public String dynamicGet() {
		return "Sub dynamicGet()";
	}
	
}
public static void main(String[] args) {
		Super sup = new Sub();
		System.out.println(sup.staticGet());
		System.out.println(sup.dynamicGet());
	}

输出结果:

Super staticGet()
Sub dynamicGet()

静态方法是与类,而非某个对象相关联的,所以静态方法不具有多态性。

原文链接:https://miansen.wang/2020/01/18/member-variables-and-static-methods-are-not-polymorphic/