1. 程式人生 > 其它 >JAVA面向物件第三課封裝和繼承

JAVA面向物件第三課封裝和繼承

技術標籤:初學java

封裝和繼承

封裝

根據對屬性的封裝來說明)吧對成員變數進行私有化,通過一個公共的方法間接的實現了訪問.

優點在於:提高了程式碼的安全性,提高了程式碼的可讀性和複用性。

getter和setter方法

set 指的是賦值的過程

程式碼構成

修飾詞 返回值型別 方法名(引數類表){
    方法體;
    返回值
}

//返回值型別: 不需要--void
//方法名:set+成員變數的名字,但是成員變數的首字母需要大寫
//引數列表:一個方法完成對一個屬性的賦值,所以只需要一個引數.引數的型別與成員變數一直,引數的名字與成員變數一致

get 取值的過程

程式碼構成

修飾詞 返回值型別 方法名(引數類表){
    方法體;
    返回值
}
//返回值型別: 型別與成員變數一致
//方法名:get+成員變數的名字,但是成員變數的首字母需要大寫
//引數列表:不需要引數
//方法體:return成員變數

繼承

定義:有兩個類:A類與B類,當兩個類之間產生父子關係的時候,我們稱為繼承
功能:
簡化程式碼,方便操作,提高程式碼的複用性,提高了安全性,增加了程式碼的健壯性,使類與類之間產生了整合的關係,是多型的前提

class Phone{
    String color;
    int model;
    public void callPhone() {
        System.out.println("打電話");
    }

}
//建立iphone類
class IPhone extends Phone{
    String gui;
    public void fangshui() {
        System.out.println("防水");
    }
}
//建立華為類
class HUAWEI extends Phone{
    public void nv() {
        System.out.println("牛逼");
    }
}

注意點:
super只能出現在子類的方法和構造方法中
super呼叫構造方法時,只能是第一句
super不能訪問父類的private成員

原理

首先由引用找到當前的子類物件,在當前的物件裡找到這個方法,找到了,直接呼叫,如果沒有,再去父類中找,找到了呼叫,找不到再繼續向上找,一直找到Object,如果還是沒有找到,說明沒有這個方法
重寫

super關鍵字

class Phone{
    String color;
    int model;
    public void callPhone() {
        System.out.println("打電話");
    }

}
//建立iphone類
class IPhone extends Phone{
    String gui;
    public void callPhone() {
        //this.callPhone;//調到的是本物件的callPhone方法---死迴圈
        super.callPhone();//直接呼叫的是父類的方法

        System.out.println("有自己特有的功能!");
    }
}

在繼承中使用構造方法

1、當一個子類中只有一個帶有引數的構造方法,只能使用帶引數的,不能使用無參的,如果想使用,必須手動建立無參的構造方法
2、當父類中只有帶引數的構造方法,子類的構造方法中就必須在第一行手動呼叫父類帶引數的構造方法(super(引數))
3、當我們創造構造方法的時候,如果自己不寫super(),系統會自動呼叫
-原因:
父類中也有屬性要進行初始化,而物件的屬性必須由自己的構造方法進行初始化,所以必須呼叫super(),所以每個構造方法中都有一個super()

this和super的比較:

this是一種引用資料型別,代表當前的物件,儲存吧的是當前物件的地址

super:不是一種引用資料型別,可以通過super呼叫父類的成員.

包的使用

好處

1、類似於檔案系統的資料夾,可以實現分類管理類檔案,方便查詢
2、解決了同一個專案中同名類的衝突問題

包的建立

命名規範:

建議小寫字母,並且採用域名倒置的寫法

域名倒置:com.baidu
www.baidu.com
www.atguigu.com
建議寫法:
com.公司名.部門名.專案名.業務模組名;
com.專案名.業務模組名;
com.atguigu.業務模組名;

包的使用

1、package關鍵字

①如果某類存在於指定包下,則要求類的最上方必須新增包的宣告語句,語法如下:

package 包名;

②包的宣告語句在一個類中只可能出現一次
③位置:最上面

2、import關鍵字

① 跨包訪問某類,必須要求匯入該類所在的包&&該類具有跨包訪問許可權

語法:

import 包名.類名;
import 包名.*;

② 匯入包的語句在一個類中可以出現多次,沒有順序要求

③ 位置:package——import——class

④ 如果想訪問多個包中的同名類,則要注意不能直接類上方新增import導包語句,否則有歧義,可以使用全類名限定的方式

static方法

static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊,但是Java語言中沒有全域性變數的概念。

被static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區或者方法區內找到他們。因此,static物件可以在它的任何物件建立之前訪問,無需引用任何物件。

用public修飾的static成員變數和成員方法本質是全域性變數和全域性方法,當宣告它類的物件時,不生成static變數的副本,而是類的所有例項共享同一個static變數。

static變數前可以有private修飾,表示這個變數可以在類的靜態程式碼塊中,或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用),但是不能在其他類中通過類名來直接引用,這一點很重要。實際上你需要搞明白,private是訪問許可權限定,static表示不要例項化就可以使用,這樣就容易理解多了。static前面加上其它訪問許可權關鍵字的效果也以此類推。

static修飾的成員變數和成員方法習慣上稱為靜態變數和靜態方法,可以直接通過類名來訪問,訪問語法為:

類名.靜態方法名(引數列表…)

類名.靜態變數名

用static修飾的程式碼塊表示靜態程式碼塊,當Java虛擬機器(JVM)載入類時,就會執行該程式碼塊(用處非常大)。

static變數

按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。兩者的區別是:

對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。

對於例項變數,每建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。

靜態方法

靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的例項變數和例項方法(就是不帶static的成員變數和成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為例項成員與特定的物件關聯!

因為static方法獨立於任何例項,因此static方法必須被實現,而不能是抽象的abstract。

static程式碼塊

static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。
  例如:

package staticPackage;

public class testStatic {
    private static int a;// 靜態變數
    private int b;// 例項變數

    static {
        testStatic.a = 3;
        System.out.println(a);
        testStatic t = new testStatic();
        t.f();
        t.b = 1000;
        System.out.println(t.b);
    }
    static {
        testStatic.a = 4;
        System.out.println(a);
    }

    public static void main(String[] args) {
        // TODO 自動生成方法存根
    }

    static {
        testStatic.a = 5;
        System.out.println(a);
    }

    public void f() {
        System.out.println("method f() executing...");
    }
    /**
     * 3
     * method f() executing...
     * 1000
     * 4
     * 5
     */
}

利用靜態程式碼塊可以對一些static變數進行賦值,最後再看一眼這些例子,有一個static的main方法,這樣JVM在執行main方法的時候可以直接呼叫而不用建立例項。這時候我們去看為什麼要寫public static void main(String[] args)那篇文章應該也好理解了吧。

今天的分享就到這裡,謝謝!