每日学到 20 - 封装、访问修饰符
1.封裝
1)封裝性的概念
2)封裝有:
3)封裝的原則
4)封裝的好處
5)封裝缺點
6)封裝性
7) 如何實現封裝
2.包組織類
1)包的作用
2)包的創建
3)包命名規范
4)JDK提供基本包
5)使用MyEclipse創建包的兩種方法
6)導包
7)使用包的注意事項
3.類的訪問修飾符
4.static修飾符
1)static可以用來修飾
2)static的作用
5.學習黑馬的一個文字游戲
1.封裝
1)封裝性的概念
封裝性是面向對象思想的三大特征之一。
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問
2)封裝有:
屬性的封裝、方法的封裝、類的封裝、組件的封裝、模塊化的封裝、系統級封裝
3)封裝的原則
將不需要對外提供的內容都隱藏起來
 把屬性隱藏,對外提供訪問接口
4)封裝的好處
①模塊化
 ?? ??? 在一個項目中分成n個模塊,每一個模塊都是相互獨立的,組合起來成為一個項目模塊化利于整個項目的維護,哪個模塊出了問題就找哪個模塊
②信息隱藏
③代碼重用
④插件化易于測試
⑤具有安全性
5)封裝缺點
會影響執行效率
6)封裝性
如果屬性沒有封裝,那么在本類之外創建對象后,可以直接訪問屬性。
private表示私有的,私有的屬性或方法只能在本類中訪問。
共有的屬性和方法可以被類外部的其他類訪問。
想要在類外部訪問私有屬性,我們需要提供擁有的方法來間接訪問。
通常在一個類中屬性都私有化,并對外提供getter and setter方法。
7) 如何實現封裝
修改屬性的可見性
創建公有的getter/setter方法
創建公有的getter/setter方法中加入屬性控制語句
2.包組織類
1)包的作用
允許類組成較小的單元(類似文件夾),易于找到和使用相應的文件
防止命名沖突,區分名字相同的類
有助于實施訪問權限控制
2)包的創建
作為Java源代碼第一條語句
 用package聲明包,以分號結尾
3)包命名規范
包名由小寫字母組成,不能以圓點開頭或結尾
 包名之前最好加上唯一的前綴,通常使用組織倒置的網絡域名
 包名后續部分依不同機構內部的規范不同而不同
4)JDK提供基本包
java.lang:虛擬機自動引入
 java.util:提供一些實用類
 java.io:輸入、輸出
5)使用MyEclipse創建包的兩種方法
分別創建包和類
 創建類的過程中創建類所在的包
6)導包
為了使用不在同一包中的類,需要在Java程序中使用import關鍵字導入這個類
7)使用包的注意事項
一個類同時引用了兩個來自不同包的同名類:
 ?? ??? 必須通過完整類名來區分
 ?? ??? 每個包都是獨立的,頂層包不會包含子包的類
 ?? ??? package和import的順序是固定的:
 ?? ??? ??? ??? ?package必須位于第一行(忽略注釋行)
 ?? ??? ??? ??? ?只允許有一個package語句
 ?? ??? ??? ??? ?其次是import
 ?? ??? ??? ??? ?接著是類的聲明
3.類的訪問修飾符
public修飾符:公有訪問級別
private:類內訪問
默認修飾符:包級私有訪問級別
protected:包外子類訪問
4.static修飾符
1)static可以用來修飾
①成員變量
 ?? ??? ??? 靜態變量,可以直接通過類名訪問
 ?? ??? ??? ??? ??? ?類的成員變量包括
 ?? ??? ??? ??? ??? ??? ??? 類變量(靜態變量)
 ?? ??? ??? ??? ??? ??? ??? ? ? ?? 被static修飾的變量
 ?? ??? ??? ??? ??? ??? ??? ?????? 在內存中只有一個拷貝
 ?? ??? ??? ??? ??? ??? ?? ? ? ? ? 類內部,可在任何方法內直接訪問靜態變量
 ?? ??? ??? ??? ??? ??? ??? ?????? 其他類中,可以直接通過類名訪問
 ?? ??? ??? ??? ??? ??? ??? 實例變量
 ?? ??? ??? ??? ??? ??? ??? ?????? 沒有被static修飾的變量
 ?? ??? ??? ??? ??? ??? ?????????? 每創建一個實例,就會為實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響
②成員方法
 ?? ??? ??? 靜態方法,可以直接通過類名訪問
③代碼塊
 ?? ??? ??? 靜態代碼塊,當Java虛擬機加載類時,就會執行該代碼塊
 ?? ??? ??? ??? ??? ?JVM加載類時,加載靜態代碼塊
 ?? ??? ??? ??? ??? ?如果有多個靜態塊,按順序加載
 ?? ??? ??? ??? ??? ?每個靜態代碼塊只會被執行一次
2)static的作用
??????????? 能被類的所有實例共享,可作為實例之間進行交流的共享數據
 ?? ??? ??? ?如果類的所有實例都包含一個相同的常量屬性,可把這個屬性定義為靜態常量類型,從而節省內存空間
5.學習黑馬的一個文字游戲
兩個玩家互相攻擊,看誰的血量先到0。
public class Role {private String name;private int blood;private char gender;private String face;String[] boyfaces = {"風流俊雅", "氣宇軒昂", "相貌英俊", "五官端正", "相貌平平", "一塌糊涂", "面目猙獰"};String[] girlfaces = {"美奐絕倫", "沉魚落雁", "婷婷玉立", "身材嬌好", "相貌平平", "相貌簡陋", "慘不忍睹"};String[] attacks_desc = {"%s使出了一招【背心釘】,轉到對方的身后,一掌向%s背心的靈臺穴拍去。","%s使出了一招【游空探爪】,飛起身形自半空中變掌為抓鎖向%s。","%s大喝一聲,身形下伏,一招【劈雷墜地】,捶向%s雙腿。","%s運氣于掌,一瞬間掌心變得血紅,一式【掌心雷】,推向%s。","%s陰手蕢起陽手跟進,一招【沒遮攔】,結結實實的捶向%s。","%s上步搶身,招中套招,一招【劈掛連環】,連環攻向%s。"};String[] injureds_desc = {"結果%s退了半步,毫發無損","結果給%s造成一處瘀傷","結果一擊命中,%s痛得彎下腰","結果%s痛苦地悶哼了一聲,顯然受了點內傷","結果%s搖搖晃晃,一跤摔倒在地","結果%s臉色一下變得慘白,連退了好幾步","結果『轟』的一聲,%s口中鮮血狂噴而出","結果%s一聲慘叫,像灘軟泥般塌了下去"};public Role() {}public Role(String name, int blood, char gender) {this.name = name;this.blood = blood;this.gender = gender;setFace(gender);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getBlood() {return blood;}public void setBlood(int blood) {this.blood = blood;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public String getFace() {return face;}public void setFace(char gender) {if (gender == '男') {int index = (int) (Math.random() * 7);this.face = boyfaces[index];} else if (gender == '女') {int index = (int) (Math.random() * 7);this.face = girlfaces[index];} else {this.face = "面目猙獰";}}public void attack(Role role) {int index1 = (int)(Math.random()*6);String KungFu = attacks_desc[index1];System.out.printf(KungFu,this.getName(),role.getName());System.out.println();int num = (int) (Math.random() * 20 + 1);int newBlood = role.blood - num;newBlood = newBlood > 0 ? newBlood : 0;role.setBlood(newBlood);if (newBlood>90){System.out.printf(injureds_desc[0],role.getName());} else if (newBlood>=80) {System.out.printf(injureds_desc[1],role.getName());}else if (newBlood>=70) {System.out.printf(injureds_desc[1],role.getName());}else if (newBlood>=60) {System.out.printf(injureds_desc[2],role.getName());}else if (newBlood>=50) {System.out.printf(injureds_desc[2],role.getName());}else if (newBlood>=40) {System.out.printf(injureds_desc[3],role.getName());}else if (newBlood>=30) {System.out.printf(injureds_desc[4],role.getName());}else if (newBlood>=20) {System.out.printf(injureds_desc[5],role.getName());}else if (newBlood>=10) {System.out.printf(injureds_desc[6],role.getName());}else {System.out.printf(injureds_desc[7],role.getName());}System.out.println();/*System.out.printf("%s的" + this.getName() + "打了%s的" + role.getName() + "一下,造成"+ num + "點傷害," + role.getName() + "剩余" + role.getBlood() + "點血量", this.face, role.face);System.out.println();*//*if (role.blood > 0) {System.out.printf("%s的" + this.getName() + "打了%s的" + role.getName() + "一下,造成"+ num + "點傷害," + role.getName() + "剩余" + role.getBlood() + "點血量", this.face, role.face);System.out.println();} else {System.out.printf("%s的" + this.getName() + "打了%s的" + role.getName() + "一下,造成"+ num + "點傷害," + role.getName() + "剩余" + role.getBlood() + "點血量", this.face, role.face);System.out.println();System.out.printf(role.getName() + "被打敗了");System.out.println();}*/}public void printPlayerInfo(){System.out.println("姓名:" +this.getName());System.out.println("性別:" +this.getGender());System.out.println("面貌:" +this.getFace());} } public class RoleTest {public static void main(String[] args) {Role player1 = new Role("張三", 100, '男');Role player2 = new Role("李四", 100, '男');player1.printPlayerInfo();player2.printPlayerInfo();while(true){player1.attack(player2);if(player1.getBlood()<=0){System.out.println(player2.getName()+"K.O了"+player1.getName());break;}player2.attack(player1);if(player2.getBlood()<=0){System.out.println(player1.getName()+"K.O了"+player2.getName());break;}}} }總結
以上是生活随笔為你收集整理的每日学到 20 - 封装、访问修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Lytro 一代资料.缘起
- 下一篇: Nuxt之Meta标签关键字描述之des
