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全部轉載請註明出處

相關文章
相關標籤/搜索