1. 程式人生 > >Java靜態屬性、靜態方法、非靜態屬性、非靜態方法的繼承問題簡單了解

Java靜態屬性、靜態方法、非靜態屬性、非靜態方法的繼承問題簡單了解

java 靜態方法 靜態屬性 非靜態屬性 非靜態方法

package com.book.web.controller;

/**
 * 父類
 * @author liweihan
 *
 */
public class Parent {
	
	public String normalStr = "父類非靜態屬性";
	public static String staticStr = "父類靜態屬性";
	public String changeStr = "父類-變量";
	public static String changeStaticStr = "父類-變量-靜態";
	
	public void normalMethod() {
		System.out.println("父類非靜態方法!");
	}
	
	public static void staticMethod() {
		System.out.println("父類靜態方法!");
	}
	
	public void changeMethod() {
		changeStr = "改變父類的非靜態屬性";
		changeStaticStr = "改變父類的靜態屬性";
	}

}
package com.book.web.controller;


/**
 * 子類繼承父類
 * @author liweihan
 *
 */
public class Child extends Parent{
	
	public String normalStr = "子類-非靜態屬性";
	public static String staticStr = "子類-靜態屬性";
	
//	@Override
	public void normalMethod() {
		System.out.println("子類-非靜態方法!");
	}
	
	/**
	 * 靜態方法不能被重寫,所以,去掉Override
	 */
//	@Override
	public static void staticMethod() {
		System.out.println("子類-靜態方法!");
	}
}
package com.book.web.controller;

/**
 * 測試類
 * @author liweihan
 *
 */
public class Test {
	
	public static void main(String[] args) {
		Child child = new Child();
		System.out.println(child.normalStr);
		System.out.println(child.staticStr);
		child.normalMethod();
		child.staticMethod();
		System.out.println("------------------- 靜態屬性、靜態方法和非靜態的屬性、非靜態方法都可以被 繼承");
		
		//父類指向之類實例
		Parent child1 = new Child();
		System.out.println(child1.normalStr);
		System.out.println(child1.staticStr);
		child1.normalMethod();
		child1.staticMethod();
		System.out.println(" ================== 靜態屬性、靜態方法和非靜態的屬性都可以被 繼承 和 隱藏  而不能夠被重寫");
		
		//獲取變量的值
		Parent parent = new Parent();
		System.out.println("1 ... " + parent.changeStr);
		System.out.println("1 --- " + parent.changeStaticStr);
		
		Child child2 = new Child();
		System.out.println("2 ... 子類獲取父類非靜態屬性值: " + child2.changeStr);
		System.out.println("2 --- 子類獲取父類靜態屬性值: " + child2.changeStaticStr);
		
		parent.changeMethod();
		System.out.println("3 ... 子類獲取父類改變後非靜態屬性值 :" + child2.changeStr);
		System.out.println("4 ... 子類獲取父類改變的靜態屬性值:" + child2.changeStaticStr);
		System.out.println(" ------------- 父類中的靜態屬性值,父類初始化後,子類可以直接使用!但是,非靜態屬性,不可以這樣!");
		
		/**
		 * 結論:
		 一、對於非靜態屬性和方法:
		 <1.>對於非靜態屬性,子類可以繼承父類的非靜態屬性。但是,當子類和父類有相同的非靜態屬性時,
		   並沒有重寫並覆蓋父類的非靜態屬性,只是隱藏了父類的非靜態屬性。
		 <2.>對於非靜態方法,子類可以繼承父類的非靜態方法並可以重寫覆蓋父類的非靜態屬性方法。
		 
		 二、對於靜態的屬性和方法
		 <1.>對於靜態屬性,子類可以繼承父類的靜態屬性。但是和非靜態的屬性一樣,會被隱藏。
		 <2.>對於靜態的方法,子類可以繼承父類的靜態方法。但是,子類不可重寫父類的靜態方法,
		     子類的同名靜態方法會隱藏父類的靜態方法。
		
		 三、http://www.cnblogs.com/kabi/p/5181941.html
		 <1.>java中靜態屬性和靜態方法可以被繼承,但是沒有被重寫(overwrite)而是被隱藏。
		 <2.>靜態方法和屬性是屬於類的,調用的時候直接通過類名.方法名完成的,不需繼承機制就可以調用。
		 	如果子類裏面定義了靜態方法和屬性,那麽這時候父類的靜態方法 或屬性稱之為“隱藏”,
		 	你如果想要調用父類的靜態方法和屬性,直接通過父類名.方法名或變量名完成,
		 	至於是否繼承一說,子類是有繼承靜態方法和屬性,但是 跟實例方法和屬性不太一樣,存在“隱藏”的這種情況。
		 	
		 <3.>靜態屬性、靜態方法和非靜態的屬性都可以被 繼承 和 隱藏  而不能夠被重寫,
		              非靜態的方法可以被繼承和重寫,
		 */
		
		
	}

}


本文出自 “我的JAVA世界” 博客,請務必保留此出處http://hanchaohan.blog.51cto.com/2996417/1948919

Java靜態屬性、靜態方法、非靜態屬性、非靜態方法的繼承問題簡單了解