一:方法的重寫(兩同兩小一大!)
1.方法名和參數列表相同,子類返回值的類型應該<=父類的,子類拋出的異常類型應該<=父類的,子類的訪問權限應該 >=父類的
2.如果父類的方法被private修飾了,則子類訪問不到,所以也就不能被重寫
因此,如果這時子類中有一個跟父類中private方法一模一樣的,那也不是重寫,只是子類的一個新方法!
二:靜態方法中爲什麼不能有this和super?(爲什麼被static修飾的方法,代碼塊不能出現實例變量?)
1.因爲static修飾的方法是屬於類的,該方法的調用者可能是一個類,而不是一個對象,
而this和super是分別是子類對象和父類對象的引用!
2.因爲被static修飾的成員是屬於類的,類成員的作用域比實例成員的作用域更大,
因此完全可能出現類成員已經初始化完成,但實例成員還不曾初始化,如果允許類成員訪問實例成員將會引起錯誤!!
三:多態:
1.java引用變量有兩個類型,一個是編譯時的類型,一個運行時的類型,如果兩個類型不一致,就會出現多態!
也就是所說的父類引用指向子類對象!(向上轉型!)
方法具備多態性,但屬性不具備!
2.引用變量只能調用它編譯時類型的方法,而不能直接調用它運行時類型的方法,
但如果實在想調用運行時類型的方法,就只能強制轉換了!
3.如果想強轉成子類,那麼必須滿足編譯時的類型是父類類型,而運行時類型是該子類類型
例如:想強轉成String,因爲obj運行時類型就是String類型的,所以可以強轉
Object obj = "hello world";
String str = (String)obj;
======================================
Object obj = 123;
String str = (String)obj;
這樣就會報: ClassCastException!
=====================================
爲了避免這種情況,應該使用instanceOf關鍵字
dog instanceOf Animal 用於判斷dog對象是否是Animal類的子類或者實現類的實例!
Object obj = 123;//你想要強轉成String,那我先判斷你,是不是String這種類型的
if(obj instanceOf String){
String str = (String)obj;
}
四:final修飾基本數據類型和引用數據類型的區別!
1.當final修飾基本數據類型的變量時,不能再對該變量重新賦值了,而且final修飾基本數據類型的變量,在編譯時 就可以確定該變量的值!所以也可以說被final修飾的變量,也就是個常量,因此變量名也可以像常量一樣大寫,單 詞之間用_連接!!
例如:public static final int MIN_VALUE = 0x80000000;
2.當final修飾的是引用類型的變量,它保存的也就是一個對象的引用,就是一個地址值,final只保證這個引用的地 址不會改變,即一直引用該對象,但該對象是可以改變的!,當final修飾的是引用類型的變量時,由於不能在編譯 時就獲取值,因此不需要採用常量規則定義
例如:final List list = new ArrayList();
3.被final修飾的成員變量
實例變量:要麼在定義該變量的時候賦初始值!,要麼在構造代碼塊中,要麼在構造器中,不能不賦值!
類變量:要麼在定義該變量的時候賦初始值!,要麼在靜態代碼塊中。
4.final修飾的類:不能有子類,比如:String,Math類,和基本類型的包裝類!
public class Demo {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
final int a = 10;
// a = 20; 報錯!
final int[] arr = {1,2,3};
arr[1] = 20;
// arr = null; //報錯!
final Demo demo = new Demo();
demo.setName("tom");
System.out.println(demo.getName());
// demo = null; //報錯!
//總結:被final修飾的變量,一定被賦值了,那麼該變量的“=”就不能再次使用了!,注意是針對於該變量!
}
}
五:不可變類!
不可變類:就是創建該類的實例後,該實例中的屬性是不可改變的!
如果想自定義不可變類
1.使用private和final修飾符來修飾該類的成員變量!
2.提供有參構造,根據傳入的參數來初始化類中的屬性!,不要提供無參構造!
3.只提供get方法,不提供set方法,因爲普通方法也無法修改final修飾的屬性
4.如果有必要就重寫hashcode和equals方法!
注:String類就是這樣做的!
public class Test {
public static void main(String[] args) {
//
/**
* 構造器這裏爲成員變量初始化,那麼肯定有一個實例變量來接收這個值,
* 查看源碼,發現Double類中定義了private final double value;
* 它也沒爲這個變量提供set方法,你操作不到這個變量,所以該成員變量的值你是無法改變的!
* 所以Double是一個良好的不可變類!
*/
Double d = new Double(6.5);
}
}
六:abstract不能和哪些關鍵字同時使用
1.abstract爲什麼不能和final同時使用?
因爲abstract修飾的類,表明這個類需要被繼承,abstract修飾方法,表明該方法應該被重寫!
而final修飾的類不能被繼承,final修飾的方法不能被重寫!
2.abstract爲什麼不能和static同時修飾一個方法?
因爲abstract修飾的方法是一個抽象方法,而static修飾的方法是一個類方法,
類方法一般通過類來調用,當類調用一個沒有方法體的方法是會報錯的。
3.abstract爲什麼不能和private同時使用?
因爲abstract修飾的方法,就是希望被子類重寫,這樣纔有意義,否則這個方法永遠不會有方法體!
如果被private修飾,那麼子類根本訪問不到該方法,又何來的重寫呢?,因此abstract不能和private同時修飾一個方法!
來自:雖然帥,但是菜的cxy
每天進步一點點