java 基础-域的访问无多态

1.1 域的访问无多态

一旦了解多态机制,就可能开始认为全部事物均可以多态的发生(在运行时才寻找对应的方法)。java

但须要注意的是只有普通的方法调用是多态的。而域不是。域属于谁的就是谁的。spa

例:code

先别看结果,请你们先推测一下输出对象

package polymorphism;

class Super {
	public int field = 0;

	public int getField() {
		return field;
	}
}

class Sub extends Super {
	public int field = 1;

	public int getField() {
		return field;
	}

	public int getSuperField() {
		return super.field;
	}
}

public class FieldAccess {
	public static void main(String[] args) {
		Super sup = new Sub(); // Upcast
		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());
	}
}

 

 

 

结果是这样的:get

sup.field = 0, sup.getField()1编译器

sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0编译

这表示当Sub对象转型为Super引用时,任何域访问操做都将由编译器解析,所以不是多态的。在本例中子对象Sub包含两个field的域,一个来自自己的,一个是从Super获得的。ast

须要了解的是,通常这种状况不会在实际工做中遇到,由于一般状况下,域的权限都是private.class

即便是public的,名字也不会和父类中的相同,这样很容易产生混淆。权限

本例主要是说明对域的访问在编译期进行,不会发生多态△△△

 

1.2  静态方法不具备多态

例:

package polymorphism;

class StaticSuper {
	public static String staticGet() {
		return "Base staticGet()";
	}

	public String dynamicGet() {
		return "Base dynamicGet()";
	}
}

class StaticSub extends StaticSuper {
	public static String staticGet() {
		return "Derived staticGet()";
	}

	public String dynamicGet() {
		return "Derived dynamicGet()";
	}
}

public class StaticPolymorphism {
	public static void main(String[] args) {
		StaticSuper sup = new StaticSub(); // Upcast
		System.out.println(sup.staticGet());
		System.out.println(sup.dynamicGet());
	}
}

结果是这样的:

 

Base staticGet()

Derived dynamicGet()

 

能够看到第一个方法是static的,是没有多态行为的。

 

著做权归@kfh全部转载请注明出处

相关文章
相关标签/搜索