Chapter10 Java封裝

Lecture1 封裝的實現

  • 封裝:將類的某些信息隱藏在類內部,不容許外部程序直接訪問,只能經過該類提供的方法來實現對隱藏信息的操做和訪問(即隱藏對象信息的同時要留出訪問的接口)
  • 封裝的特色:java

    1. 只能經過規定的方法訪問數據
    2. 隱藏類的實例細節,方便修改和實現
  • 封裝代碼的實現:dom

    1. 修改屬性的可見性 -- 設爲private
    2. 建立getter/setter方法 -- 設爲public,用於屬性的讀寫
    3. 在getter/setter方法中加入屬性控制語句

Tips:只有getXXX方法的屬性是隻讀屬性;只有setXXX方法的屬性是隻寫屬性工具

  • Java封裝的意義:測試

    • 防止使用者錯誤修改系統的屬性
    • 提升系統的獨立性
    • 提升軟件的可重用性
  • Java封裝案例:
package Chapter10.Lecture1.cat;

/**
 * 寵物貓類的封裝
 */
public class Cat {
    //1.修改屬性的可見性--private,限定只能在當前類內被訪問
    private String name;    //暱稱
    private int month;      //年齡

    public Cat(){

    }

    //經過帶參構造方法賦值
    public Cat(int month) {
        this.setMonth(month);
    }

    //2. 建立getter/setter方法
    public String getName() {
        return "我是一隻叫" + name + "的寵物貓";
    }

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

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        if (month <= 0) {
            System.out.println("信息輸入錯誤,年齡必須大於0");
        } else {
            this.month = month;
        }
    }
}
package Chapter10.Lecture1.cat;

public class CatTest {
    public static void main(String[] args) {
        //對象實例化
        Cat one = new Cat();
        //經過帶參構造方法建立類
        Cat two = new Cat(-2);
        //測試
        //會輸出屬性month的初始值0
        System.out.println("年齡:"+two.getMonth());

        one.setName("花花");
        System.out.println(one.getName());

        one.setMonth(-1);
        if (one.getMonth() == 0) {
            return;
        }
        System.out.println("年齡:" + one.getMonth());
    }
}
  • 定義Java包:語法 -- package 包名;,必須放在Java源文件中的第一行;一個Java源文件中只能有一個package語句
  • Java包的做用:管理Java文件;解決同名文件衝突
  • Java包的特色:Java中一個包裏不能存在同名類,建議每一個包內儲存的信息功能單一
  • Java包的命名:域名倒序+模塊名+功能名(推薦所有使用小寫)
  • 導入包的方法:this

    1. 經過import 包名.*;導入此包下的全部類
    2. 經過import 包名.類名;導入此包下的指定類
    3. 經過在源代碼中直接加載包名.類名;

建議採用import 包名.類名;的方式加載,提升效率code

Tips:加載類的順序跟import導入語句的位置無關對象

  • 當經過import 包名.*;只能訪問到指定包名下的類,沒法訪問子包下的類
  • Java經常使用系統包:
java.lang 包含Java語言的基礎的類,該包系統加載時默認導入,如:System、String、Math
java.util 包含Java語言中經常使用工具,如:Scanner、Random
java.io 包含輸入、輸出相關功能的類,如File、InputStream

Lecture2 static關鍵字

  • static關鍵字:表示靜態信息;特徵:類對象共享(即共享同一塊內存空間);類加載時產生,銷燬時釋放,生命週期長
  • 靜態成員的訪問方法:遞歸

    1. 對象.成員名
    2. 類名.成員名

推薦調用方式:類名.靜態成員接口

  • static + 屬性 -- 靜態屬性、靜態屬性;static + 方法 -- 靜態方法、類方法;沒有靜態的類(只能使用public、abstract、final修飾)和靜態的局部變量(只能使用final修飾)
  • 普通成員方法能夠調用類中任何成員(包括靜態成員),而靜態方法中不能直接訪問同一個類中的非靜態成員,只能直接調用同一個類中的靜態成員
  • 代碼塊:在語句中出現「 {} 」,就叫作代碼塊;出如今方法裏 -- 普通代碼塊(順序執行 - 先出現,先執行;能夠有多個普通代碼塊 );出如今類中 -- 構造代碼塊(建立對象時調用,優先於構造方法執行;能夠有多個構造代碼塊),能夠給全部成員賦值;static + 構造代碼塊 -- 靜態代碼塊(只在類加載時調用執行一次,優先於構造代碼塊執行;能夠有多個靜態代碼塊),只能給靜態成員賦值
  • 變量的做用範圍:從定義處開始至大括號閉合
  • static關鍵字及代碼塊案例:
package Chapter10.Lecture2.animal;

public class Cat {
    //靜態成員、類成員
    public static int price;   //售價

    private String name;    //暱稱
    private int month;  //年齡
    private double weight;  //體重
    private String species; //品種

    {
        System.out.println("我是構造代碼塊");
    }

    static {
        System.out.println("我是靜態代碼塊");
    }

    public String getName() {
        return name;
    }

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

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }

    public static void eat() {
        //靜態方法中不能直接訪問同一個類中的非靜態成員,只能直接調用同一個類中的靜態成員
        //run();
        //name = "小明";
        //只能經過對象實例化後,對象.成員方法的方式訪問非靜態成員
        Cat temp = new Cat();
        temp.run();
        temp.name = "小明";
        //靜態方法中不能使用this
        //this.name = "小明";
        Cat.price = 100;
        System.out.println("小貓吃魚");
    }

    //在成員方法中,能夠直接訪問類中的靜態成員
    public void run() {
        {
            System.out.println("我是普通代碼塊");
        }
        this.name = "凡凡";
        Cat.price = 20;
        eat();//此行代碼會致使棧溢出,註釋掉後執行(緣由:遞歸調用)
        System.out.println("售價是" + Cat.price + "的" + this.name + "快跑");
    }
}
package Chapter10.Lecture2.test;

import Chapter10.Lecture2.animal.Cat;

public class Test {
    public static void main(String[] args) {
        Cat one = new Cat();
        one.setName("花花");
        one.setMonth(2);
        one.setSpecies("英國短毛貓");
        //one.price = 2000;
        Cat.price = 2000;

        Cat two = new Cat();
        two.setName("凡凡");
        two.setMonth(1);
        two.setSpecies("中華田園貓");
        //two.price = 150;
        Cat.price = 150;

        System.out.println(one.getName() + "的售價爲:" + one.price);
        System.out.println(two.getName() + "的售價爲:" + two.price);

        //one.eat();
        Cat.eat();
        System.out.println("----------------------");

        one.run();
    }
}
相關文章
相關標籤/搜索