面向对象1(super、this)
目錄
?
1.局部變量和成員變量
2.參數傳遞
2.1基本數據類型作為參數傳遞
2.2 引用類型作為參數傳遞
3.面向對象的三個特征
3.1 封裝
3.2 繼承
成員變量
成員方法
3.3 多態
前提:
定義格式:
缺點
優點
4.this關鍵字
通過this實現構造方法的相互引用
5.super關鍵字
1. 局部變量和成員變量
| ? | 局部變量 | 成員變量 |
| 位置 | 方法中或者{ }中 | 類中 |
| 內存中的位置 | 棧內存的方法中 | 堆內存的對象中 |
| 生命周期 | 隨著方法的運行而出現在棧中;隨著方法的彈棧而消失 | 隨著對象的出現而出現在堆中;隨著對象的消失而從堆中消失 |
| 初始化 | 無默認初始值; 需手動賦值才可用 | 可不用初始化 所有默認的初始化 |
2. 參數傳遞
2.1 基本數據類型作為參數傳遞
class Demo{public static void main(String[] args){int x=4;show(x);System.out.println("x="+x); }public static void show(int x){x=5;} }運行結果:
分析:
將基本類型變量來那個x空間中的值復制了一份傳遞給調用的方法show();
在show()方法中的x接收到了復制的值,再對x進行操作,只會影響到show中的x;
當show()執行完彈棧后,程序又回到main()執行;
main()中的x還是原來的值。
2.2 引用類型作為參數傳遞
public class DemoTest {int x;public static void main(String[] args){DemoTest d=new DemoTest();d.x=5;show(d);System.out.println("x="+d.x); }public static void show(DemoTest d){d.x=5;} }運行結果:
分析:
將引用變量空間中的內存地址(引用)復制了一份傳遞給了show()的d引用變量;
這時兩個引用同時指向堆中的同一個對象
當執行了shou()中的d.x=6時,會根據d所持有的引用找到堆中的對象,并將其x屬性的值改為6,show()彈棧。
由于兩個引用指向同一個對象,不管那個引用改變了引用所指向的對象中的值,其他引用再次使用都是改變后的值。
3. 面向對象的三個特征
3.1 封裝
- 表現:方法就是一個最基本的封裝體,類也是一個封裝體,用private修飾的變量也是封裝體;
- 好處:提高了代碼的復用性;隱藏了具體實現細節,需對外提供可訪問的方式(setter()/getter());提高了安全性
3.2 繼承
通過繼承可以是多種事物之間形成一種關系體系。
關鍵字:extends
子類在繼承父類后,會自動擁有的父類的成員
- 好處:提高了代碼的復用率,提高軟件開發率;讓類與類之間出現了關系提供了多態的前提
注意:
- Java中只支持單繼承;
- 多個類可以繼承一個類;
- Java中可多層繼承;
- Java中,子類和父類是一種相對的概念。
成員變量
當子父類出現同名成員變量時,若子類要訪問父類中的成員變量,需使用關鍵字super;
- super表示當前對象中包含的父類對象空間的引用。
當在程序中通過對象調用方法時:
- 會先在子類中查找有沒有對應的方法;
- 若子類中存在,則執行子類中的方法;
- 若子類中沒有,則執行父類中響應的方法。
成員方法
override:重寫、覆蓋
- 子類中出現與父類一模一樣的方法
- 用@Override標注
- 子類覆蓋父類的方法必須保證權限大于等于父類權限
- 必須一模一樣:方法名、參數列表
- 弊端:類和類之間耦合度過高
- 優點:提高改嗎重用性,可維護性,是多態前提之一
所有的類都直接或間接繼承了Object類
overload:重載
- 在同一個類中,多個方法名稱相同,參數列表(個數、數據類型)不同。
3.3 多態
表示當同一個操作作用在不同對象上時,會有不同的語義,從而會產生不同的結果。
最終多態體現為:父類引用可指向子類對象
前提
- 必須有子父類關系或者類實現接口的關系
- 方法的重寫
- 父類引用指向子類對象
在使用多態后的父類引用變量調用方法時,會調用子類重寫后的方法。(若多個子類重寫,則調用的是各個子類自己重寫的方法(動態綁定))
表現方式
運行結果
Base b=new Derived();會調用Base類的構造方法。而在Base類的構造方法中執行了g()。由于多態,此時會調用子類Deriverd的g(),而非Base類的g(),因此會輸出第一個Derived g()。
定義格式
父類 ?? 變量名 = new ? ? 子類();
抽象類 ?? 變量名 = new ?? 抽象類子類();
接口 ?? 變量名 = new ?? 接口實現類();
當子父類出現同名的成員變量時,多態調用該變量時,編譯運行看左邊(父類);
- Dad d=new Son();
- d.num; ?? 調用的是父類的成員變量
- 因為Java中成員變量沒有重寫的概念。
運行結果
1
當子父類出現同名的成員方法時,多態調用該方法時,編譯看左邊,運行看右邊(子類);
- 編譯時會檢查左邊父類中有無對應的成員
當子父類出現同名的靜態方法時,多態調用該方法,編譯運行看左邊(父類)(相當于類名調用,所以也是看父類);
- 都看左邊
缺點
無法直接訪問子類的特有成員,需向下轉型。
優點
繼承的優點(可維護性);
可擴展性。
4. this關鍵字
可在成員變量上加上this,來區別成員變量和局部變量
class Person{private int age;public int getAge() {return this.age;}public void setAge(int age) {this.age=age;} }public class DemoTest{public static void main(String[] args) {Person p=new Person();p.setAge(30);System.out.println(p.getAge());} }運行結果:
分析:
若局部變量名和成員變量名相同,在使用時采用的是就近原則。
通過this實現構造方法的相互引用
this(參數列表)
package ObjectOriented;class Person{private int age;private String name;Person(){}Person(String nm){name=nm;}Person(int a,String nm){this(nm);age=a;} }public class DemoTest{public static void main(String[] args) {Person p=new Person(30,"張三");} }分析:
5. super關鍵字
子類中的所有構造方法的第一行由默認的隱式的super();語句;
- 原因:因為子類繼承了父類的內容,所以創建對象時,必須先要看父類是如何對其內容進行初始化的
當父類中沒有空參構造方法時,子類的構造方法必須有顯示的super語句,指定要訪問的父類有參的構造方法;
若第一行用this調用了本類的其他構造方法,則此時無super();
- 因為它們都在第一行,初始化動作要先執行
- super,this不共存
父類構造方法中也有隱式的super
- 只要是構造方法,第一行默認都是super();
父類的父類是Object,它是所有對象的父類。
由于有super()調用父類無參構造方法,所以父類的構造方法既可以給自己的對象初始化,也可以給子類的對象初始化化
super(arg);——也可以有參數。
如果子類構造方法的第一行沒有調用父類的構造方法,則會默認調用副類的無參構造(有的話),也可用super(arg)在子類構造方法中的第一行顯式調用父類的有參構造。
父類的構造方法會先執行,因為先初始化父類中的成員變量,自誒后面可能要用到。
- 訪問父類的構造函數:可以使用 super() 函數訪問父類的構造函數,從而委托父類完成一些初始化的工作。
- 訪問父類的成員:如果子類重寫了父類的中某個方法的實現,可以通過使用super 關鍵字來引用父類的方法實現。
?
?
總結
以上是生活随笔為你收集整理的面向对象1(super、this)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java垃圾回收(GC)、找垃圾的方式、
- 下一篇: 面向对象2(构造方法、抽象类、接口)