1. 上轉型對象
1.是什麼? 子類的對象賦給了父類對象,例如 Jk_Father j= jk; 其中,j 就是上轉型對象 ,上轉型之後 ,j 這個對象 不能訪問子類中新增的屬性和方法,所以它能調用的屬性和方法都是父類中原有的,如果子類覆蓋或重寫了由父類繼承下來屬性和方法,則調用的是覆蓋或重寫之後的值,總的來說,上轉型的效果相當於 子類對象不能訪問自己新增的屬性和方法了,其他正常。
package test1;
public class Jk extends Jk_Father{
int workyear=12;
int leval =23;
@Override
public void work() {
System.out.println("工作了"+workyear+"年");
System.out.println(age);
}
public void playGame() {
System.out.println("play games ");
}
public static void main(String[] args) {
Jk jk = new Jk();
Jk_Father j= jk;
j.work();
j.leval;//不能調用新增的屬性和方法和方法
j.playGame();//不能調用新增的屬性和方法和方法
}
}
上轉型之後還可以進行下轉型,下轉型之後就還是子類的對象了,可以訪問子類中任何屬性和方法
Jk jjkk =(Jk)j;
jjkk.playGame();
但是父類直接下轉型到子類是不行的。只有像上面這樣,由子類上轉型成父類對象,然後再下轉型回子類對象可以,其他情況不行
Jk_Father jf = new Jk_Father();
Jk k = (Jk)jf;
k.playGame();
出現的錯誤:
java.lang.ClassCastException: test1.Jk_Father cannot be cast to test1.Jk
at test1.Jk.main(Jk.java:29)
2.多態
多態分爲 靜態多態性 和動態多態性。
Java實現多態有三個必要條件:繼承、重寫、向上轉型。
在Java中有兩種形式可以實現多態:繼承和接口
1.靜態多態性指的就是重載,重載的概念就是 一組方法 ,它們的方法名相同,但是參數列表不同,參數列表不同的情況有,參數的個數不同,參數的數據類型不同,和參數的數據類型的排列順序不同。這裏對返回值類型不做考慮。
2.動態多態性指的就是重寫 override, 重寫的定義就是子類對父類繼承下來的方法做了修改,覆蓋了父類繼承下來的方法,重寫的方法的方法和父類的方法方法名,參數列表一樣,而且要求訪問範圍應該一樣或者更廣,比如父類是proteceted的,那麼子類重寫後應該至少默認,甚至public 訪問控制符的範圍 依次是 public, protected, default, private
下面這個就是多態 Jk_Father jf = new Jk(); 在下面的代碼中有。其實歸根到底還是一個上轉型對象,不能調用新增方法和屬性,一旦你重載了父類的方法,這個方法就是子類新增的方法了,這是上轉型對象就不能訪問了。很正常。另外,你去訪問重寫後的方法時,當然是訪問的是重寫之後地方法。
package test1;
public class Jk extends Jk_Father{
int workyear=12;
public int leval=23;
public void work(int leval) {//這是重載
System.out.println("工作了"+workyear+"年");
System.out.println(leval);
}
/*public void work() {//這是重寫
System.out.println("工作了"+workyear+"年");
}*/
public void playGame() {
System.out.println("play games ");
}
public static void main(String[] args) {
Jk_Father jf = new Jk();
jf.work();
}
}
3.異常
分爲檢查時異常和運行時異常,檢查時異常我們必須處理,用try catch 去捕獲異常,要麼用throws 去拋出異常,運行時異常我們也可以不處理,系統會自動捕獲異常
這次的變量命名不太好,下次會改進的!!
最後貼一個自己覺得寫的更好的一篇博客: https://www.cnblogs.com/chenssy/p/3372798.html