讀了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,會因爲不能的實現,打印出來的值不同。這樣就失去了接口的意義。
接口是概念級抽象,它不表示任何實體,而屬性是用於表示某個對象特徵,如果接口擁有非靜態屬性,那豈不違背了接口高度抽象的原則。