多态,面向对象
/**
?*? 里氏替換原則 :
?*????? 能使用父類的地方,一定可以使用子類
?*? 什么是多態 :
?*????????? 父類的引用,指向子類的對象
?*? 多態的前提條件 :
?*????????? 有繼承關系的兩個類
?*? 多態的目的 :
?*??????? ☆☆☆? 代碼的重用
?*? 多態發什么在什么時候 :
?*????????? 賦值的時候
?* ?
?* !!!!!!!!! 多態中的 ☆☆☆? 覆寫 是特指的 成員方法!!!!!!!!!
?*? 什么是覆寫 :
?*????????? 就是在子類有個和父類相同的方法 : 方法名 , 參數列表 , 返回值類型 (和修飾符列表沒關系)
?*????????????? 1 方法名相同 : 不相同,就是兩個不一樣的方法了? 不是覆寫
?*????????????? 2 參數列表相同 : 參數列表不同,就是方法的重載了,也不是覆寫
?*?????????????????????????????? 參數列表的 個數 和 數據類型 都相同 才叫相同吧
?*????????????? 3 返回值類型相同 ; 返回值代表函數(方法)的功能,覆寫是為了功能更強大,不能降低功能,所以必須相同
?*????????? 覆寫之后 不能比原有的方法有更低的訪問權限 ( 權限的降低 就意味著 功能的降低 )
?*????????? 覆寫之后 不能比原有的方法有更寬泛的異常 ( 只能異常越來越低 )
?*
?*!!!!! ☆☆☆ 父類的屬性列表是在編譯的時候就生成了 : 就是javac的時候☆☆☆
?*!!!!! ☆☆☆ 子類的屬性列表是在運行時才生成 : 就是java運行的時候☆☆☆
?*
?*? 父類和子類的調用有兩種形式 :
?*???????? 1 多態 父類引用指向子類的對象? 父類型 變量名 = new 子類構造方法();
?*????????????? 靜態變量,靜態方法,成員變量 :
?*???????????????????????????????????????? 當這樣用引用變量名去調用方法或者變量時 , 先去父類找,如果有這個變量(方法).就會直接執行,不會再去子類中找,如果父類沒有這個變量(方法),直接報錯( 錯誤 : 找不到符號 ),不會去子類中找,因為現在子類的屬性列表還沒有,現在是編譯期報錯,所以沒法去子類找
?*????????????? 成員方法 :
?*?????????????????????? 當調用成員方法的時候,先去父類中找,父類如果有,再去子類中找,如果子類覆寫了成員方法,就執行子類的成員方法,如果子類沒有覆寫,就還執行父類的,但是如果父類沒有的成員方法,但是子類有,直接報錯( 錯誤 : 找不到符號 ),不會去子類找(不會執行子類特有的成員方法),因為子類現在還沒有屬性列表,現在只是在編譯期報錯.
?*????????? 2 直接實例化? 子類型 變量名 = new 子類構造方法();
?*????????????? 靜態變量,靜態方法,成員變量 :
?*???????????????????????????????????????? 先去子類找,如果子類有這個變量(方法),就執行,不會再去父類找,如果子類沒有這個變量(方法),就會去父類找,執行父類,但是如果子類和父類都沒有,就報錯( 錯誤 : 找不到符號 )
?*????????????? 成員方法 :
?*?????????????????????? 如果子類有,父類也有,就按子類的執行,那是方法的覆寫? ,如果子類沒有,就去父類找,執行父類的,如果子類有,父類沒有,就執行子類的(用于執行子類特有的方法,是父類沒有的),如果都沒有,就報錯( 錯誤 : 找不到符號 )
?*
?*/
下面是代碼 :
public class Duo_Tai{
??? public static void main(String[] args){
??????? //第一種 多態 父類引用 指向子類的對象
??????? Fu_Lei f = new Zi_Lei();
???????? //--------------------變量------------------------------
??????????? //父類有的 子類沒有的 靜態變量
??????????? int i = f.i;
??????????? System.out.println( i ); // 輸出100? 是 父類的 靜態變量
??????????? //父類有的 子類也有的 靜態變量
??????????? int a = f.a; //這里的兩個變量 不會沖突 因為前面那個int a 是局部變量? 后面那個f.a 是類中的靜態變量
??????????? System.out.println( a ); //輸出1? 是 父類的 靜態變量 為什么輸出的不是子類的 111
??????????? //父類有的 子類沒有的 成員變量
??????????? int j = f.j;
??????????? System.out.println( j );//輸出200 是 父類的 成員變量
??????????? //父類有的 子類也有的 成員變量
??????????? int b = f.b;
??????????? System.out.println( b );//輸出2 是 父類的 成員變量 為什么輸出的不是子類的 2222
??????????? /*
??????????? //父類沒有 子類有的 靜態變量? 為什么?為什么不去調用子類的?
?????????? int m = f.m;? //Duo_Tai.java:48: 錯誤: 找不到符號
??????????? System.out.println( m );
??????????? //父類沒有 子類有的 成員變量? 為什么?為什么不去調用子類的?
??????????? int n = f.n;? //Duo_Tai.java:52: 錯誤: 找不到符號
??????????? System.out.println( n );
??????????? */
??????? //--------------------方法------------------------------
??????????? //父類有的 子類沒有的 靜態方法
??????????????? f.m6();? //輸出 父類的 靜態方法
??????????? //父類有的 子類也有的 靜態方法
??????????????? f.m3();? //輸出 父類的 靜態方法
??????????? //父類有的 子類沒有的 成員方法
??????????????? f.m2();? //輸出 父類的 成員方法
??????????? //父類有的 子類也有的 成員方法
??????????????? f.m1();? //輸出 父類的 成員方法
??????????? /*
??????????? //父類沒有 子類有的 靜態方法?? 為什么報錯?為什么不去調用子類的?
??????????????? f.m5();? //Duo_Tai.java:68: 錯誤: 找不到符號
??????????? //父類沒有 子類有的 成員方法?? 為什么報錯?為什么不去調用子類的?
??????????????? f.m4();? //Duo_Tai.java:71: 錯誤: 找不到符號
??????????? */
//----------------------------------------------------------------------????????? ?
??????? //第二種 直接實例化多態 子類引用 是子類的對象
??????? Zi_Lei z = new Zi_Lei();
???????? //--------------------變量------------------------------
??????????? //父類有的 子類沒有的 靜態變量
??????????????? int i1 = z.i;? // 輸出 父類 的 靜態變量
??????????????? System.out.println( i1 ); // 為什么子類沒有 不會報錯?而是去調用父類的
??????????? //父類有的 子類也有的 靜態變量
??????????????? int a1 = z.a;? // 輸出 子類 的 靜態變量
??????????????? System.out.println( a1 );
??????????? //父類有的 子類沒有的 成員變量
??????????????? int j1 = z.j;? // 輸出 父類 的 成員變量
??????????????? System.out.println( j1 );
??????????? //父類有的 子類也有的 成員變量
??????????????? int b1 = z.b;? // 輸出 子類 的 成員變量
??????????????? System.out.println( b1 );
??????????? //父類沒有 子類有的 靜態變量
??????????????? int m1 = z.m;? // 輸出 子類 的 靜態變量
??????????????? System.out.println( m1 ); //為什么父類沒有 不會報錯?
??????????? //父類沒有 子類有的 成員變量
??????????????? int n1 = z.n;? // 輸出 子類 的 成員變量
??????????????? System.out.println( n1 );
??????? //--------------------方法------------------------------
??????????? //父類有的 子類沒有的 靜態方法
??????????????? z.m6();? //輸出 父類的 靜態方法 為什么沒有報錯?而且去調用父類的了靜態方法
??????????? //父類有的 子類也有的 靜態方法
??????????????? z.m3();? //輸出 子類的 靜態方法
??????????? //父類有的 子類沒有的 成員方法
??????????????? z.m2();? // 輸出 父類的 成員方法 為什么沒有報錯?而且去調用父類的成員方法
??????????? //父類有的 子類也有的 成員方法
??????????????? z.m1();? //輸出 子類的 成員方法 為什么?!!!!☆☆☆
??????????? //父類沒有 子類有的 靜態方法
??????????????? z.m5();? //輸出 子類的 靜態方法
??????????? //父類沒有 子類有的 成員方法
??????????????? z.m4();? //輸出 子類的 成員方法
??? }
}
class Fu_Lei{//聲明一個父類
??? static int i = 100;//靜態變量 父類的 子類沒有的
??? static int a = 1;//靜態變量 子類也有的
??? int j = 200;//成員變量 父類的 子類沒有的
??? int b = 2;//父類的 子類也有的
??? public void m1(){//被覆寫的成員變量(子類有的)
??????? System.out.println( "我是父類的成員方法," );
??? }
??? public void m2(){//沒有被覆寫的成員變量 (子類沒有的)
??????? System.out.println( "我是父類的成員方法,沒有被覆寫的" );
??? }
??? public static void m3(){//靜態方法 子類也有
??????? System.out.println( "我是父類的靜態變量" );
??? }
??? public static void m6(){//子類沒有的靜態方法
??????? System.out.println( "子類沒有的靜態方法" );
??? }
}
class Zi_Lei extends Fu_Lei{//聲明一個子類? 繼承( extends )父類
??? static int m = 3;//父類沒有的靜態變量
??? int n = 8;//父類沒有的成員變量
??? static int a = 111;//父類也有的
??? int b = 2222;//父類也有的
??? public void m1(){//父類有的成員方法
???????? System.out.println( "我是子類,我覆寫了父類的m1()成員方法" );
??? }
??? public void m4(){//父類沒有的成員方法
???????? System.out.println( "我是子類,我這個方法,父類沒有,是我自己的" );
??? }
??? public static void m3(){//父類有的靜態方法
???????? System.out.println( "我是子類的靜態方法,父類也有哦" );
??? }
??? public static void m5(){//父類沒有的靜態方法
???????? System.out.println( "我是子類的靜態方法 , 父類沒有," );
??? }
}
轉載于:https://www.cnblogs.com/xrmqbl/p/4735126.html
總結
- 上一篇: 转换PDF技巧1之PDF虚拟打印机操作详
- 下一篇: 段错误产生原因及简单的调试方法