Java中继承、this关键字、super关键字
生活随笔
收集整理的這篇文章主要介紹了
Java中继承、this关键字、super关键字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
繼承:
概述:當多個類中存在相同屬性和行為時,將這些相同的內容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承抽離出來的這個類即可。
子類:當某個類繼承了另一個類的時候,可以把這個某類稱為子類。
父類:當某個類被繼承時,這個被繼承的類可以稱為父類(也稱為超類或基類)。
定義:子類繼承父類的屬性或行為,使得子類對象具有父類的相同的屬性或行為,子類可以直接訪問父類中的私有屬性和行為。
繼承的優點:代碼重復利用;類與類存在關系,是多態的前提。
// 1.定義一個父類:FatherClass類:定義父類跟定義普通的類沒有任何區別,如: public class FatherClass{// 定義父類中的方法和屬性:String FatherStr1 = "這是FatherClass父類中的FatherStr1";public static void FatherMethods(){System.out.println("父類FacherClass中的FatherMethods方法執行了");}// 定義與子類重名的屬性和方法:String SameProp = "這是父類中:子類和父類中重名都有的屬性SameProp";public static void SameMethods(){System.out.println("這是父類中:子類和父類中重名都有的方法SameMethods");};// 6-2:通過方法訪問成員變量或成員方法的情況:public void msf(){System.out.println(SameProp);//這是父類中:子類和父類中重名都有的屬性SameProp SameMethods();//這是父類中:子類和父類中重名都有的方法SameMethods// 訪問子類中不同名的屬性或方法:// System.out.println(name2);//FatherClass.java:22: 錯誤: 找不到符號:System.out.println(name2)中name2;// method2();//錯誤: 找不到符號:method2()中method2;}// 定義不同名屬性和方法供子類mss方法訪問:String name1 = "父類中name1";public static void method1(){System.out.println("父類中的method1");}// 7-2:當局部變量和子類中成員變量及父類中成員變量同時重名時的訪問規則:String threeSameStrs = "父類中的threeSameStrs"; } // 2.定義一個繼承了FatherClass類的子類SonClass:子類的定義需要使用關鍵字:extends,如: public class SonClass extends FatherClass{//定義子類的基本格式:public class 子類名 extends 父類名{}// 定義子類中的方法和屬性:String SonStr1 = "這是子類SonClass中的SonStr1";public static void SonMethods(){System.out.println("子類SonClass中的SonMethods方法執行了");} // 定義與父類重名的屬性和方法:String SameProp = "這是子類中:子類和父類中重名都有的屬性SameProp";public static void SameMethods(){System.out.println("這是子類中:子類和父類中重名都有的方法SameMethods");};// 6-2:通過方法訪問成員變量或成員方法的情況:public void mss(){System.out.println(SameProp);//這是子類中:子類和父類中重名都有的屬性SameProp SameMethods();//這是子類中:子類和父類中重名都有的方法SameMethods// 訪問父類中不同名的屬性或方法:System.out.println(name1);//父類中name1method1();//父類中的method1}// 定義不同名屬性和方法供父類msf方法訪問:String name2 = "子類中name2";public static void method2(){System.out.println("子類中的method2");}// 7-1:當局部變量和子類中成員變量及父類中成員變量同時重名時的訪問規則:String threeSameStrs = "子類中的threeSameStrs";public void threeSameStr(){String threeSameStrs = "局部變量中的threeSameStrs"; System.out.println(threeSameStrs);//局部變量中的threeSameStrsSystem.out.println(this.threeSameStrs);//子類中的threeSameStrsSystem.out.println(super.threeSameStrs);//父類中的threeSameStrs// 訪問局部變量直接寫,訪問本類中變量通過this.變量名,訪問父類中的變量通過super.變量名;} } // 3.定義一個TestSonObj類,用于測試繼承關系中子類訪問父類中的屬性或方法: public class TestSonObj{public static void main(String[] args){// 4-1:使用子類SonClass類創建一個對象:sonObj,如:SonClass sonObj = new SonClass();// 4-2:通過子類SonClass定義的sonObj對象調用父類FatherClass中的成員變量和方法,如:System.out.println(sonObj.FatherStr1);//這是FatherClass父類中的FatherStr1sonObj.FatherMethods();//父類FacherClass中的FatherMethods方法執行了//雖然子類中沒有定義以上兩個方法和變量,但是通過繼承可以將父類中的屬性或行為繼承到子類中,子類可以定義多個來繼承父類,這樣可以節省很多公共代碼。// 4-3:訪問子類和父類重名的屬性和方法:// 直接通過.的方式訪問:System.out.println(sonObj.SameProp);//這是子類中:子類和父類中重名都有的屬性SamePropsonObj.SameMethods();//這是子類中:子類和父類中重名都有的方法SameMethods// 創建一個FatherClass類對象:fo,用來測試重名屬性和方法:FatherClass fo = new FatherClass();System.out.println(fo.SameProp);//這是父類中:子類和父類中重名都有的屬性SamePropfo.SameMethods();//這是父類中:子類和父類中重名都有的方法SameMethods// 對于子類和父類中重名的屬性和方法直接通過對象.點出屬性或方法時,點.左邊對象是用誰創建的就用(訪問)誰的重名方法或屬性;//間接通過方法訪問成員變量或成員方法的情況:sonObj.mss();// 對于子類和父類中重名的屬性或方法通過方法間接訪問時,各自訪問的是自己本身的屬性或方法;// 對于子類和父類中不重名且本類中沒有的屬性或方法通過方法間接訪問時,子類會向父類中查找,沒有則會報錯,而對于父類而言,不會像子類查找,本類沒有則直接報錯;// 7-3:當局部變量和子類中成員變量及父類中成員變量同時重名時的訪問規則:sonObj.threeSameStr();// 訪問局部變量直接寫,訪問本類中變量通過this.變量名,訪問父類中的變量通過super.變量名;} } // 5.定義一個TestFatherObj類,用于測試繼承關系中是否有父類訪問子類中的屬性或方法的關系: public class TestFatherObj{public static void main(String[] args){// 6-1:使用父類FatherClass類創建一個fatherObj對象:FatherClass fatherObj = new FatherClass();// System.out.println(fatherObj.SonStr1);//TestFatherObj.java:5: 錯誤: 找不到符號:System.out.println(fatherObj.SonStr1)中SonStr1;// fatherObj.SonMethods();//TestFatherObj.java:7: 錯誤: 找不到符號:fatherObj.SonMethods()中的SonMethods;// 父類是無法訪問子類中的屬性和方法的,也就是說繼承中沒有父類訪問子類中的屬性或方法的關系。// 6-2:訪問子類和父類重名的屬性和方法:// 直接通過點訪問屬性或方法的情況:System.out.println(fatherObj.SameProp);//這是父類中:子類和父類中重名都有的屬性SamePropfatherObj.SameMethods();//這是父類中:子類和父類中重名都有的方法SameMethods// 創建一個SonClass類對象:so,用來測試重名屬性和方法:SonClass so = new SonClass();System.out.println(so.SameProp);//這是子類中:子類和父類中重名都有的屬性SamePropso.SameMethods();//這是子類中:子類和父類中重名都有的方法SameMethods// 對于子類和父類中重名的屬性和方法直接通過對象.點出屬性或方法時,點.左邊對象是用誰創建的就用(訪問)誰的重名方法或屬性;//間接通過方法訪問成員變量或成員方法的情況:fatherObj.msf();// 對于子類和父類中重名的屬性或方法通過方法間接訪問時,各自訪問的是自己本身的屬性或方法;// 對于子類和父類中不重名且本類中沒有的屬性或方法通過方法間接訪問時,子類會向父類中查找,沒有則會報錯,而對于父類而言,不會像子類查找,本類沒有則直接報錯;} }成員方法重寫:
子類和父類中出現重名且方法參數一致的成員方法時,這種情況稱為方法重寫,也叫方法覆蓋,方法覆寫;與方法重載需區別,重載是方法名相同,但是方法參數列表不同。
注解:@Override
@Override用于檢測是否存在方法重寫,其使用規則為:在定義方法時在public上一行直接寫@Override,注意,后面不能跟標點符號。
public class OverrideFather{public void overRideMethod(){System.out.println("父類中的overRideMethod方法");}// 1-1:方法重寫中:子類的返回值的范圍一定要小于等于父類返回值范圍,如:public Object messages(){return "123";}// 2-1:子類方法的權限修飾符必須大于父類方法的權限修飾符,權限修飾符權限大寫:public > protected > (default,留空什么也不寫) > privateObject say(){return "hello";} } public class OverrideSon extends OverrideFather{@Overridepublic void overRideMethod(){super.overRideMethod();//父類中的overRideMethod方法System.out.println("子類中的overRideMethod方法");//子類中的overRideMethod方法}// 1-2:方法重寫中:子類的返回值的范圍一定要小于等于父類返回值范圍,如:public String messages(){return "123456";}// 2-1:子類方法的權限修飾符必須大于父類方法的權限修飾符,權限修飾符權限大寫:public > protected > (default,留空什么也不寫) > privatepublic Object say(){return "hello123";}// 3.子類的構造方法中會默認調用父類的無參構造方法,其是用super()調用;// 繼承關系中,父子類構造方法的訪問特點:// 3-1: 子類構造方法當中有一個默認隱含的“super()”調用,所以一定是先調用的父類構造,后執行的子類構造。// 3-2: 子類構造可以通過super關鍵字來調用父類重載構造。// 3-3: super的父類構造調用,必須是子類構造方法的第一個語句。不能一個子類構造調用多次super構造。// 子類必須調用父類構造方法,不寫則贈送super();寫了則用寫的指定的super調用,super只能有一個,還必須是第一個。public OverrideSon(){//子類構造方法:super();//子類無參構造器中默認會調用父類無參構造方法,super()調用必須是第一個語句,如果構造方法自己寫了,那么一定要記得調用父類的構造方法:使用super()調用即可。}/*總結:super關鍵字的用法有三種:1. 在子類的成員方法中,訪問父類的成員變量:super.變量名2. 在子類的成員方法中,訪問父類的成員方法:super.方法名()3. 在子類的構造方法中,訪問父類的構造方法:super()*/// 4.this關鍵字:用來訪問本類中的內容,用法有三種:// 4-1:在本類的成員方法中訪問本類的成員變量:String strthis = "123456";public void testThis(){String strthis = "123";System.out.println(strthis);//123,訪問的為局部變量System.out.println(this.strthis);//123456,訪問的為成員變量} // 4-2:在本類的成員方法中訪問另一個成員方法,如:this.methods(),這種方式只是起強調作用,直接通過方法名()也可以調用:methods();// 4-2:在本類的構造方法中訪問另一構造方法,如:public OverrideSon(){this(String hello);//在本類中的無參構造方法中調用了有參構造方法,這里也必須是構造方法中的第一語句,因此它們不能同時使用。}public OverrideSon(String str){}; } public class OverrideSonObj{public static void main(String[] args){OverrideSon orobj = new OverrideSon();orobj.overRideMethod();System.out.println(orobj.messages());//123456System.out.println(orobj.say());//hello123// 覆蓋重寫常用于對老的類的更新,但是并非更新原文件,而是通過繼承和方法重寫,重新寫一個類。} }java語言繼承的特點:
1.java語言是單繼承的:父類只能有一個(只能繼承一個類),但是可以多級繼承(繼承一個繼承了某類的類)。
2.一個類可以被多個類繼承。
提示:本文圖片等素材來源于網絡,若有侵權,請發郵件至郵箱:810665436@qq.com聯系筆者刪除。
筆者:苦海
總結
以上是生活随笔為你收集整理的Java中继承、this关键字、super关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5视频抓取,js和HTML5基于
- 下一篇: DOS命令、Java语言开发环境(JVM