Lecture1 封裝的實現(xiàn)
- 封裝:將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問,只能通過該類提供的方法來實現(xiàn)對隱藏信息的操作和訪問(即隱藏對象信息的同時要留出訪問的接口)
- 封裝的特點:
- 只能通過規(guī)定的方法訪問數(shù)據(jù)
- 隱藏類的實例細(xì)節(jié),方便修改和實現(xiàn)
- 封裝代碼的實現(xiàn):
- 修改屬性的可見性 -- 設(shè)為private
- 創(chuàng)建getter/setter方法 -- 設(shè)為public,用于屬性的讀寫
- 在getter/setter方法中加入屬性控制語句
Tips:只有g(shù)etXXX方法的屬性是只讀屬性;只有setXXX方法的屬性是只寫屬性
- Java封裝的意義:
- 防止使用者錯誤修改系統(tǒng)的屬性
- 提高系統(tǒng)的獨立性
- 提高軟件的可重用性
- Java封裝案例:
package Chapter10.Lecture1.cat;
/**
* 寵物貓類的封裝
*/
public class Cat {
//1.修改屬性的可見性--private,限定只能在當(dāng)前類內(nèi)被訪問
private String name; //昵稱
private int month; //年齡
public Cat(){
}
//通過帶參構(gòu)造方法賦值
public Cat(int month) {
this.setMonth(month);
}
//2. 創(chuàng)建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();
//通過帶參構(gòu)造方法創(chuàng)建類
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中一個包里不能存在同名類,建議每個包內(nèi)儲存的信息功能單一
- Java包的命名:域名倒序+模塊名+功能名(推薦全部使用小寫)
- 導(dǎo)入包的方法:
- 通過
import 包名.*;導(dǎo)入此包下的所有類 - 通過
import 包名.類名;導(dǎo)入此包下的指定類 - 通過在源代碼中直接加載
包名.類名;
- 通過
建議采用import 包名.類名;的方式加載,提高效率
Tips:加載類的順序跟import導(dǎo)入語句的位置無關(guān)
- 當(dāng)通過
import 包名.*;只能訪問到指定包名下的類,無法訪問子包下的類 - Java常用系統(tǒng)包:
| java.lang | 包含Java語言的基礎(chǔ)的類,該包系統(tǒng)加載時默認(rèn)導(dǎo)入,如:System、String、Math |
|---|---|
| java.util | 包含Java語言中常用工具,如:Scanner、Random |
| java.io | 包含輸入、輸出相關(guān)功能的類,如File、InputStream |
Lecture2 static關(guān)鍵字
- static關(guān)鍵字:表示靜態(tài)信息;特征:類對象共享(即共享同一塊內(nèi)存空間);類加載時產(chǎn)生,銷毀時釋放,生命周期長
- 靜態(tài)成員的訪問方法:
- 對象.成員名
- 類名.成員名
推薦調(diào)用方式:類名.靜態(tài)成員
- static + 屬性 -- 靜態(tài)屬性、靜態(tài)屬性;static + 方法 -- 靜態(tài)方法、類方法;沒有靜態(tài)的類(只能使用public、abstract、final修飾)和靜態(tài)的局部變量(只能使用final修飾)
- 普通成員方法可以調(diào)用類中任何成員(包括靜態(tài)成員),而靜態(tài)方法中不能直接訪問同一個類中的非靜態(tài)成員,只能直接調(diào)用同一個類中的靜態(tài)成員
- 代碼塊:在語句中出現(xiàn)“ {} ”,就叫做代碼塊;出現(xiàn)在方法里 -- 普通代碼塊(順序執(zhí)行 - 先出現(xiàn),先執(zhí)行;可以有多個普通代碼塊 );出現(xiàn)在類中 -- 構(gòu)造代碼塊(創(chuàng)建對象時調(diào)用,優(yōu)先于構(gòu)造方法執(zhí)行;可以有多個構(gòu)造代碼塊),可以給所有成員賦值;static + 構(gòu)造代碼塊 -- 靜態(tài)代碼塊(只在類加載時調(diào)用執(zhí)行一次,優(yōu)先于構(gòu)造代碼塊執(zhí)行;可以有多個靜態(tài)代碼塊),只能給靜態(tài)成員賦值
- 變量的作用范圍:從定義處開始至大括號閉合
- static關(guān)鍵字及代碼塊案例:
package Chapter10.Lecture2.animal;
public class Cat {
//靜態(tài)成員、類成員
public static int price; //售價
private String name; //昵稱
private int month; //年齡
private double weight; //體重
private String species; //品種
{
System.out.println("我是構(gòu)造代碼塊");
}
static {
System.out.println("我是靜態(tài)代碼塊");
}
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() {
//靜態(tài)方法中不能直接訪問同一個類中的非靜態(tài)成員,只能直接調(diào)用同一個類中的靜態(tài)成員
//run();
//name = "小明";
//只能通過對象實例化后,對象.成員方法的方式訪問非靜態(tài)成員
Cat temp = new Cat();
temp.run();
temp.name = "小明";
//靜態(tài)方法中不能使用this
//this.name = "小明";
Cat.price = 100;
System.out.println("小貓吃魚");
}
//在成員方法中,可以直接訪問類中的靜態(tài)成員
public void run() {
{
System.out.println("我是普通代碼塊");
}
this.name = "凡凡";
Cat.price = 20;
eat();//此行代碼會導(dǎo)致棧溢出,注釋掉后執(zhí)行(原因:遞歸調(diào)用)
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();
}
}