private與static的方法是不是默認爲final的測試

讀了thinkinjava後,說private與static的方法是final的,只是把final關鍵字給隱藏了。自己測試了下,


public class Father {
	private void privateSay(){
		System.out.println("father private say!");
	}
	public static void staticSay(){
		System.out.println("father static say");
	}
	public void publicSay(){
		System.out.println("father public say");
	}

	public static void main(String[] args) {
		Father f = new Sun();
		f.privateSay();
		f.publicSay();
		f.staticSay();
	}
}

public class Sun extends Father{

	@Override
	public void publicSay() {
		super.publicSay();
		System.out.println("sun public say!");
	}
	private void privateSay(){
		System.out.println("sun private say!");
	}
	public static void staticSay(){
		System.out.println("sun static say");
	}
	public static void main(String[] args) {
		Father f = new Sun();
		//f.privateSay();  //-->編譯錯誤
		f.publicSay();
		f.staticSay();
	}
}

father類中打印出

father private say!

father public say

sun public say!

father static say
sub類打印出

father public say

sun public say!

father static say


可以看出private與static的方法是默認帶有final的,是不能被 重載的,而只有非final的方法是纔是後期綁定(執行期綁定)。所以private與static方法沒有被重寫。

而在Sun類內調用privateSay方法編譯時報錯 也就 驗證了private方法是在前期綁定(編譯期綁定)的,報錯是因爲privateSay是父類的私用方法,就算在子類內重新寫了一個同名的方法也不能調用,這樣才能保證父類中的私有方法不被覆蓋。

staticSay是public但是final所以不能覆蓋,最終打印出來的是:father static say。



再說下interface中的變量



public interface StaticVar {
	String  var = "interface var";	
}
public class StaticVarImp implements StaticVar {
	String  var = "implements var";
	
	public static void main(String[] args) {
		StaticVar sv = new StaticVarImp();
		System.out.println(sv.var);
	}
}

打印出來的是

interface var

接口中的成員變量 默認 是寫成public static final的

public:接口是要被其它類實現的所以要用public關鍵字。

static:每個實現類都公用這個變量,static後內存中就只有一個變量。

final: 不能說在打印sv.var,會因爲不能的實現,打印出來的值不同。這樣就失去了接口的意義。

接口是概念級抽象,它不表示任何實體,而屬性是用於表示某個對象特徵,如果接口擁有非靜態屬性,那豈不違背了接口高度抽象的原則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章