1. 程式人生 > >JavaSE基礎學習(八)——面向物件

JavaSE基礎學習(八)——面向物件

1.1 面向物件思想

1.1.1 概述: 我們回想一下,之前我們完成一個需求的步驟:首先是搞清楚我們要做什麼,然後在分析怎麼做,最後我們再程式碼體現。一步一步去實現,而具體的每一步都需要我們去實現和操作。這些步驟相互呼叫和協作,完成我們的需求。在上面的每一個具體步驟中我們都是參與者,並且需要面對具體的每一個步驟和過程,這就是面向過程最直接的體現。 那麼什麼是面向過程開發呢? 面向過程開發,其實就是面向著具體的每一個步驟和過程,把每一個步驟和過程完成,然後由這些功能方法相互呼叫,完成需求。 面向過程的代表語言:C 語言 當需求單一,或者簡單時,我們一步一步去操作沒問題,並且效率也挺高。可隨著需求的更改,功能的增多,發現需要面對每一個步驟很麻煩了,這時就開始思索,能不能把這些步驟和功能在進行封裝,封裝時根據不同的功能,進行不同的封裝,功能類似的封裝在一起。這樣結構就清晰了很多。用的時候,找到對應的類就可以了。這就是面向物件的思想。

1.1.2 特點

  • 是一種更符合我們思考習慣的思想
  • 可以將複雜的事情簡單化
  • 將我們從執行者變成了指揮者(角色發生了轉換)

1.2  類與物件及其使用

  • 類與物件關係
    • 我們學習程式語言,就是為了模擬現實世界的事物,實現資訊化。比如:去超市買東西的計費系統,去銀行辦業務的系統。
    • 我們如何表示一個現實世界事物呢:
      • 屬性 就是該事物的描述資訊
      • 行為 就是該事物能夠做什麼
      • 舉例:學生事物
  • 我們學習的 Java 語言最基本單位是類,所以我們就應該把事物用一個類來體現。
  • 類:是一組相關的屬性和行為的集合。
  • 物件:是該類事物的具體體現。
  • 舉例:
    • 類 學生
    • 物件 班長就是一個物件
  • 類的定義:
    • 現實世界的食物:
      • 屬性 事物的描述資訊
      • 行為 事物能做什麼
  • Java 中用 class 描述事物也是如此
    • 成員變數 就是事物的屬性
    • 成員方法 就是事物的行為
  • 定義類其實就是定義類的成員(成員變數和成員方法)
    • 成員變數:和以前定義變數是一樣的,只不過位置發生了改變。在類中,方法外。
    • 成員方法:和以前定義方法是一樣的,只不過把 static 去掉。
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 10:47
 * @Description:
 */
public class Student {

    //成員變數
    
    // 姓名
    String name;
    //年齡
    int age;

    //成員方法

    //學習的方法
    public void study() {
        System.out.println("好好學習,天天向上");
    }

    //吃飯的方法
    public void eat() {
        System.out.println("學習之後餓了要吃飯");
    }
}
  • 物件的建立及其使用
    • 建立物件:類名 物件名 = new 類名();
    • 使用物件訪問類中的成員:物件名.成員變數     物件名.成員方法
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 10:49
 * @Description:
 */
public class StudentDemo {
    public static void main(String[] args) {

        //建立物件格式:類名 物件名 = new 類名();
        Student s = new Student();
        System.out.println("s:" + s); // s:[email protected]
        //直接輸出成員變數值
        System.out.println("姓名:" + s.name); // null
        System.out.println("年齡:" + s.age); // 0
        System.out.println("----------");
        //給成員變數賦值
        s.name = "張三";
        s.age = 18;
        //再次輸出成員變數的值
        System.out.println("姓名:" + s.name); // 張三
        System.out.println("年齡:" + s.age); // 18
        System.out.println("----------");
        //呼叫成員方法
        s.study(); // 好好學習,天天向上
        s.eat(); // 學習之後餓了要吃飯
    }
}

1.3 物件的記憶體圖

  • 定義Phone類
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 10:56
 * @Description:
 */
public class Phone {
    String brand; // 品牌
    int price; // 價格
    String color; // 顏色

    public void call(String name) {
        System.out.println("給" + name + "打電話");
    }

    public void sendMessage() {
        System.out.println("群發簡訊");
    }
}
  • 一個物件的記憶體圖
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 10:56
 * @Description:
 */
public class Phone {
    String brand; // 品牌
    int price; // 價格
    String color; // 顏色

    public void call(String name) {
        System.out.println("給" + name + "打電話");
    }

    public void sendMessage() {
        System.out.println("群發簡訊");
    }
}

1.4 成員變數和區域性變數的區別

  • 在類中的位置不同
    • 成員變數:類中,方法外
    • 區域性變數:方法中或者方法宣告上(形式引數)
  • 在記憶體中的位置不同
    • 成員變數:堆記憶體
    • 區域性變數:棧記憶體
  • 生命週期不同
    • 成員變數:隨著物件的建立而存在,隨著物件的消失而消失
    • 區域性變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
  • 初始化值的不同
    • 成員變數:有預設值
    • 區域性變數:沒有預設值。必須先定義,賦值,最後使用
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 11:06
 * @Description:
 */
public class VariableDemo {
    int x; // 成員變數

    public void show() {
        int y = 0; // 區域性變數
        System.out.println(x);
        System.out.println(y);
    }
}

1.5 封裝

  • Private 關鍵字由來及其使用
    • private 關鍵字
      • 是一個許可權修飾符。
      • 可以修飾成員(成員變數和成員方法)
      • 被 private 修飾的成員只在本類中才能訪問

原來的程式碼已經報錯了,成員被private修飾,私有。

  • private 最常見的應用:
    • 把成員變數用 private 修飾
    • 提供對應的 getXxx()/setXxx()方法

成員變數私有化的標準程式碼

package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 13:46
 * @Description:
 */
public class Student02 {

    private String name;
    private int age;

    public void setName(String name) {
        name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        age = age;
    }

    public int getAge() {
        return age;
    }
}
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 13:46
 * @Description:
 */
public class Student02Demo {
    public static void main(String[] args) {
        //建立物件
        Student02 s = new Student02();
        System.out.println(s.getName() + "---" + s.getAge());
        s.setName("張三");
        s.setAge(18);
        System.out.println(s.getName() + "---" + s.getAge());
    }
}
  • 封裝的概述:
    • 是面向物件三大特徵之一。
    • 是面向物件程式語言對客觀世界的模擬,客觀世界裡成員變數都是隱藏在物件內部的,外界無法直接操作和修改。就像剛才說的年齡。
  • 封裝原則:
    • 將不需要對外提供的內容都隱藏起來。
    • 把屬性隱藏,提供公共方法對其訪問。
    • 成員變數 private,提供對應的 getXxx()/setXxx()方法。
  • 封裝好處:
    • 通過方法來控制成員變數的操作,提高了程式碼的安全性。
    • 把程式碼用方法進行封裝,提高了程式碼的複用性。

1.6 this關鍵字

  • this 關鍵字的由來:
    • this:代表所在類的物件引用
    • 記住:方法被哪個物件呼叫,this 就代表那個物件
  • this 關鍵字的使用:
    • 區域性變數隱藏成員變數(區域性變數和成員變數重名)

1.7  構造方法

  • 作用:
    • 給物件的資料進行初始化
  • 格式:
    • 方法名與類名相同
    • 沒有返回值型別,連 void 都沒有
    • 沒有具體的返回值 修飾符 構造方法名(引數列表){   }
  • 注意事項:
    • 如果你不提供構造方法,系統會給出預設構造方法
    • 如果你提供了構造方法,系統將不再提供
    • 構造方法也是可以過載的
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 14:35
 * @Description:
 */
public class Student03 {
    private String name;
    private int age;

    public Student03() {
    }

    public Student03(String name) {
        this.name = name;
    }

    public Student03(int age) {
        this.age = age;
    }

    public Student03(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println(name + "----" + age);
    }
}
package com.study.demo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 14:41
 * @Description:
 */
public class Student03Demo {
    public static void main(String[] args) {
        //如何呼叫構造方法呢?
        //通過 new 關鍵字呼叫
        //格式:類名 物件名 = new 構造方法(...);
        Student03 s = new Student03();
        s.show(); // null----0
        //public Student(String name)
        Student03 s2 = new Student03("張三");
        s2.show(); // 張三----0
        //public Student(int age)
        Student03 s3 = new Student03(18);
        s3.show(); // null----18
        //public Student(String name,int age)
        Student03 s4 = new Student03("張三", 18);
        s4.show(); // 張三----18
    }
}

標準學生類程式碼編寫和測試

  • 類:
    • 成員變數
    • 構造方法:無參構造方法                   帶參構造方法
    • 成員方法:getXxx()                   setXxx()
    • 給成員變數賦值的方式:無參構造方法+setXxx()                                         帶參構造方法
package com.study.demo.studentdemo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 15:01
 * @Description:
 */
public class Student04 {

    private String name;
    private int age;

    public Student04() {
    }

    public Student04(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package com.study.demo.studentdemo;

/**
 * @Auther: lds
 * @Date: 2018/11/10 15:02
 * @Description:
 */
public class Student04Demo {

    public static void main(String[] args) {
        // 無參構造方法
        Student04 s = new Student04();
        s.setName("張三");
        s.setAge(18);
        System.out.println("name: " + s.getName() + " age: " + s.getAge());

        //有參構造
        Student04 ss = new Student04("李四", 19);
        System.out.println("name: "+ ss.getName()+" age: "+ss.getAge());
    }
}

今天先寫到這裡吧,明天是雙十一了,小夥伴們準備好了嗎?