protected
用來修飾 域,代表域的訪問權限是:包權限 或者 不同包,但是是子類 ;
final 修飾常量
只要是該常量代入的計算式,在編譯時期,就會被執行計算,以減輕運行時的負擔。(只對基本數據類型的計算式,奏效)
final 修飾引用
這個有個地方需要說下,只是引用指向的對象,一經確定,就不再可以修改爲指向別的對象。但是對象本身的屬性,可以隨意改變;
空白 final
就是被申明爲final,但是未賦值的域 ,稱爲 空白final ;但是在使用之前,必須對其進行賦值;
這樣就可以靈活的爲其進行賦值,但是又保持了其不可更改的特性 ;
final 參數
就是方法參數,被final修飾了;跟final引用一樣,無法更改其指向其他對象 ;
final 方法
被修飾的方法,只能被繼承,但是不能被覆蓋 ;被修飾爲final的方法,其實是用了前期綁定,因此,在之前這樣做是可以提升效率的;
final 類
final類不可被繼承,final類的方法,都被隱式的設定爲final,但是域,不是final的,可以根據自己的意願來設定 ;
子父類中同名的 private 方法
public class test {
public static void main(String[] args) {
A a = new B();
a.haha(); ; // error
a.hehe(); ; // ok
}
}
class A{
private void haha(){
System.out.println(“A”);
}
public void hehe(){
System.out.println("A");
}
}
class B extends A{
private void haha(){
System.out.println(“B”);
}
}
它們之間是沒有任何關係的;只是恰巧重名了 ;它們不能發生多態的行爲;
方法的覆蓋和向上轉型,只針對方法是父類中能被子類繼承的方法 ;因此,它們之間是沒有向上轉型、覆蓋的說法的,也就沒有多態的行爲;
java中的前期綁定
我們都知道,java是採用後期綁定的;
但是,其實在java中有的地方,也採用可前期綁定;比如:static方法、final方法;這兩種方法是前期綁定的;
由於private是隱式的final方法,因此,private方法也是前期綁定哦;
對了 構造器也是前期綁定,因爲,其實,那個構造器是隱式的static方法 ;
免疫多態
域 和 靜態方法 是不會產生多態行爲的 ;
任何對 域 的操作,都是在 編譯時期 完成的,此時編譯器認爲父類引用的就是父類的對象,因此,根本不存在多態的可行性;
靜態方法,不存在多態的原因是:靜態方法 是 前期綁定,此時編譯器,也是單純的認爲,父類引用指向的就是父類對象,天真!
對於它們,是 編譯看左邊,運行看左邊;
class A {
public int a = 1 ;
private void haha(){
System.out.println("A");
}無錫哪家醫院婦科好 http://www.bhnfk.com/
public void hehe(){
System.out.println("A");
}
public static void aa(){
System.out.println("aa");
}
}
class B extends A{
public int a = 2 ;
private void haha(){
System.out.println(“B”);
}
public static void aa(){
System.out.println("bb");
}
}
public class test {
public static void main(String[] args) {
A a = new B();
System.out.println(a.a);
a.aa();
}
}
// output:1 aa ;都是輸出父類的。