Java面向对象(1) —— 封装
目錄
- 一、封裝的概念
- 二、類的封裝以及使用
- 三、訪問修飾符
- 四、屬性封裝的實(shí)現(xiàn)
- 五、方法封裝的實(shí)現(xiàn)
- 六、UML類圖
- 七、類的構(gòu)造方法與可重載
- 八、this關(guān)鍵字
- 九、static關(guān)鍵字
- 十、方法重載:overload
- 十一、包:package
一、封裝的概念
將字段(C結(jié)構(gòu)體中的屬性)和方法(C結(jié)構(gòu)體中的函數(shù))包裝進(jìn)類中,加上具體實(shí)現(xiàn)的隱藏(訪問修飾符),共同被稱作為封裝,其結(jié)果是一個(gè)同時(shí)帶有特征和行為的數(shù)據(jù)類型。
定義類,定義其屬性、方法的過程稱為封裝類。
學(xué)會(huì)從C語言的結(jié)構(gòu)體中轉(zhuǎn)換概念:
struct Student {int age; //類似與java中的屬性 特征char* name;void (*introduce)(int age,int name,int score); //函數(shù) = 方法void (*testFunc)(); };二、類的封裝以及使用
//封裝一個(gè)類 class Student //寫規(guī)范來,第一個(gè)字母大寫 {int age; //特征String name; //JAVA中沒有char*double score;void introduce(){ // 方法 = C語言中的函數(shù)System.out.println("my name is"+name + "age:"+age + "score"+score);} //面向?qū)ο蟮奶匦跃褪欠椒梢栽L問本類的特征屬性,不需要額外的去傳參void testFunc(){System.out.println("testFunc");} }//怎么使用這個(gè)類呢? public class Demo1 {public static void main(String[] args) {Student stu1 = new Student(); //這操作叫實(shí)例化一個(gè)對象//類 = 模板,類不能直接使用,不能直接訪問變量,需要先實(shí)例化,申請一個(gè)空間。//改成Student stu1 = null,好比C語言的指針使用前不malloc開辟空間/*這操作就等同于在c語言中,我們對結(jié)構(gòu)體指針的定義及訪問struct Student* p;p = malloc(sizeof(struct Student));*/stu1.age = 18;stu1.score = 99.5;stu1.name = "小明"; //不需要像C語言中strcpy賦值stu1.introduce();} }其中比較重要的概念:
面向?qū)ο蟮奶匦跃褪欠椒梢栽L問本類的特征屬性,不需要額外傳參
三、訪問修飾符
訪問修飾符用于信息隱藏,是OOP(Object Oriented Programming面向?qū)ο蟮木幊?#xff09;重要的功能。
隱藏信息的原因:
(1)對模塊的任何實(shí)現(xiàn)細(xì)節(jié)所做的更改不會(huì)影響使用該模塊的代碼
(2)防止用戶意外修改數(shù)據(jù)
(3)使模塊易于維護(hù)和使用(就是電腦配件)
(4)規(guī)范方法,特征的使用空間
訪問修飾符:訪問權(quán)限(通過“.”來訪問),可以看到private是最嚴(yán)格的:
| 同一個(gè)類 | 是 | 是 | 是 | 是 |
| 同一個(gè)包(文件)內(nèi)的類 | 否 | 是 | 是 | 是 |
| 不同包內(nèi)的子類 | 否 | 否 | 是 | 是 |
| 不同包且不是子類 | 否 | 否 | 否 | 是 |
權(quán)限怎么理解呢?
下面就以 “只有正確輸入銀行卡密碼才能讀取銀行卡信息” 為例子
四、屬性封裝的實(shí)現(xiàn)
封裝屬性:修改屬性的可見性來限制對屬性的訪問。
為每個(gè)屬性創(chuàng)建一對賦值方法(getter)和取值(setter)方法,用于公開對這些屬性的訪問接口,在getter和setter方法中,根據(jù)需要加入對屬性操作的限制。
舉一個(gè)最簡單的例子:
public class Student {private String name; //可以通過下面的方法間接訪問隱私屬性public void setName(String name){this.name = name;}public String getName(){return name;} }五、方法封裝的實(shí)現(xiàn)
方法封裝的目的:隱藏方法實(shí)現(xiàn)細(xì)節(jié)(方法體),向外部提供公開接口(方法頭),以供安全調(diào)用;簡化調(diào)用,方便修改維護(hù);可以私有化方法,以提供內(nèi)部使用——幫助方法helper。
先設(shè)置自己的真實(shí)年齡為36歲,當(dāng)別人當(dāng)面問你多少歲時(shí),通過“封裝的”不對外公開的方法修改了自己的真實(shí)年齡,再告訴他我18歲。
但是如果直接訪問簡歷上的年齡,通過這個(gè)方法訪問到的就是真實(shí)年齡36歲
class Age//注意這個(gè)類的名字第一個(gè)大寫(好習(xí)慣),不能跟下面的age一樣 {private int age;void setAge(int realAge){age = realAge;}private void tellAlie(int falseAge){age = falseAge;}void askMyAge()//當(dāng)別人問我的姓名 假{tellAlie(18); //外部不知道這個(gè)方法的存在System.out.println("別人問我我就說我永遠(yuǎn)"+age);}void resumeAge() //真{System.out.println("簡歷上是真實(shí)年齡:"+age);} } public class Demo3 {public static void main(String[] args) {Age a1 = new Age();a1.setAge(36);a1.resumeAge();//通過這個(gè)方法訪問到的是真實(shí)年齡a1.askMyAge(); //不對外公開的方法修改了真實(shí)年齡} }六、UML類圖
UML-Unified Modeling Language 統(tǒng)一建模語言,又稱標(biāo)準(zhǔn)建模語言。
(1)類的命名盡量采用應(yīng)用領(lǐng)域內(nèi)的術(shù)語。
(2)類的屬性、操作中的可見性用+ # -分別表示public protected private
七、類的構(gòu)造方法與可重載
類的構(gòu)造方法的概念和作用
構(gòu)造方法負(fù)責(zé)對象初始化工作,為對象的屬性賦合適的初始值。
在用戶操作對象之前,系統(tǒng)就已經(jīng)完成了類的構(gòu)造方法。
構(gòu)造方法的語法規(guī)則
(1)構(gòu)造方法名與類名一致
(2)沒有返回類型
(3)方法實(shí)現(xiàn)主要為特征賦初值
構(gòu)造方法的調(diào)用很特別:實(shí)例化對象(new)的時(shí)候,自動(dòng)被調(diào)用
java系統(tǒng)保證每個(gè)類都有構(gòu)造方法:如果沒有指明,系統(tǒng)將自動(dòng)為其分配“空參數(shù)”的構(gòu)造方法。
class Student {private int age;int momAge;String name;float score;Student(int newAge,String newName,float newScore)//方法名字與類名相同{ //構(gòu)造方法在實(shí)例化對象new時(shí)會(huì)被調(diào)用,到時(shí)候再傳遞參數(shù)//如果不寫,系統(tǒng)自動(dòng)實(shí)現(xiàn),無參無內(nèi)容System.out.println("構(gòu)造方法一被調(diào)用");age = newAge;name = newName;score = newScore;}//java中,方法是可重載的,即為函數(shù)名一樣,參數(shù)列表不同即可,C語言是不允許的Student(String newName){System.out.println("構(gòu)造方法二被調(diào)用");name = newName;}Student(String newName,float newScore){System.out.println("構(gòu)造方法三被調(diào)用");name = newName;score = newScore;}Student(float newScore,String newName) //傳入?yún)?shù)類型不同,調(diào)換順序就成為新的構(gòu)造方法{System.out.println("構(gòu)造方法四被調(diào)用");name = newName;score = newScore;}/* 不能同時(shí)有兩個(gè)int int類似的構(gòu)造方法,否則數(shù)據(jù)混淆,IDEA不給你用Student(int newAge,int newMomAge){System.out.println("構(gòu)造方法五被調(diào)用");age = newAge;momAge = newMomAge;}Student(int newMomAge,int newAge){System.out.println("構(gòu)造方法五被調(diào)用");age = newAge;momAge = newMomAge;}*/ } public class Demo1 {public static void main(String[] args) { //使用哪種構(gòu)造方法,根據(jù)傳入的參數(shù)而定(不僅是靠個(gè)數(shù)判斷)Student stu1 = new Student(20,"小明",100);Student stu2 = new Student("小明");Student stu3 = new Student("小明",100);Student stu4 = new Student(100,"小明");//Student stu5 = new Student(100,100);System.out.println(stu1.name + stu1.score);} }運(yùn)行結(jié)果:
構(gòu)造方法一被調(diào)用 構(gòu)造方法二被調(diào)用 構(gòu)造方法三被調(diào)用 構(gòu)造方法四被調(diào)用 小明100.0八、this關(guān)鍵字
(1) 調(diào)用此方法的對象的引用
(2)可以看做是一個(gè)變量,它的值是對當(dāng)前對象的引用
(3)可以處理方法中的成員變量與形參同名的問題
(4)在類的構(gòu)造方法中可以調(diào)用this([參數(shù)列表])來調(diào)用該類的指定構(gòu)造方法
舉例子看看這4個(gè)用法:
class student {String name;int age;void thisTest(){//第一種使用方法示例:System.out.println(this.name);//第二種使用方法示例:student stuTemp = null;//臨時(shí)的對象,太像結(jié)構(gòu)體指針了stuTemp = this; //把當(dāng)前對象賦給stuTemp.當(dāng)前對象:如果是對象stu1,那么就是stu1對象賦給它System.out.println(stuTemp.age);//必須開辟空間(有對象)}//第三種使用方法示例:最常用的解決同名問題/*student(String name,int age){name = name;age = age;} */student(String name,int age){System.out.println("構(gòu)造方法1被調(diào)用了");this.name = name; //name傳給當(dāng)前對象的namethis.age = age;}//第四種使用方法示例:構(gòu)造方法中又調(diào)用另一個(gè)構(gòu)造方法student(String name){this("小明",21); //this構(gòu)造方法只能放在第一句!!!System.out.println("構(gòu)造方法2被調(diào)用了");this.name = name;} }public class Demo1 {public static void main(String[] args) {student stu1 = new student("小明");//被指定了使用這個(gè)構(gòu)造方法stu1.thisTest();//thisTest是一種方法,而stu1是調(diào)用這個(gè)方法的對象//this就是對這個(gè)對象的一種引用,引用他的特征,所以//會(huì)輸出stu1對象的信息} }九、static關(guān)鍵字
(1)用來修飾類的成員 —— 修飾成員變量的稱為類變量(靜態(tài)變量)
(2)用來修飾成員方法 —— 稱之為類方法(靜態(tài)方法)
(3)用來修飾語句塊 —— 稱之為靜態(tài)代碼塊
靜態(tài)代碼塊先于構(gòu)造方法之前執(zhí)行,只會(huì)執(zhí)行一次,用來對靜態(tài)成員做初始化。當(dāng)類被加載的時(shí)候靜態(tài)代碼塊就會(huì)被加載,優(yōu)先于對象的存在。
因?yàn)殪o態(tài)代碼塊的優(yōu)先于對象存在,所以靜態(tài)方法中不能出現(xiàn)this關(guān)鍵字:this指的是對象的引用,而static是先于對象存在的
(4)不實(shí)例化直接使用類的特征,就是依賴于對象直接對類進(jìn)行訪問
(5)調(diào)用的時(shí)候可以直接通過類名.成員來進(jìn)行訪問。
例子
class Student {String name;int score;static int money; //1、類變量(靜態(tài)變量)Student(String name,int score){ //構(gòu)造方法System.out.println("構(gòu)造方法");this.name = name;this.score = score;}static { //3、靜態(tài)代碼塊的格式要求System.out.println("靜態(tài)代碼塊"); //靜態(tài)代碼塊優(yōu)先于構(gòu)造方法執(zhí)行money = 5; //并且只執(zhí)行一次,因?yàn)殪o態(tài)變量同類一起,一開始就存在了(相對于需要?jiǎng)?chuàng)建的對象)} //但構(gòu)造方法每次在實(shí)例化一個(gè)對象都會(huì)執(zhí)行/*static void test(){System.out.println(this.name); //靜態(tài)方法中不能出現(xiàn)this關(guān)鍵字}*/ //因?yàn)殪o態(tài)代碼塊早于對象的創(chuàng)建,而this就是對對象的引用//并且只能對靜態(tài)成員做初始化 即moneyvoid introduce(){System.out.println("名字:"+name + " 分?jǐn)?shù):"+score);} }public class Demo1 {public static void main(String[] args) {Student stu1 = new Student("小明",98);Student stu2 = new Student("陳立臣",100);Student.money = 10; //不通過對象,直接通過類名訪問類的特征。//這個(gè)靜態(tài)變量優(yōu)先于對象的存在(當(dāng)類被加載時(shí),money也就被加載了)//而對象實(shí)例化之后才有System.out.println("ret = "+add(1,1));//2、不通過對象,直接訪問類的方法 /*如果不用static,只能new,用對象.方法的方式來訪問Demo1 d1 = new Demo1();System.out.println("ret = "+d1.add(1,1));*/}static int add(int a,int b){ //2、類方法 脫離對象,直接使用方法 優(yōu)先于對象的存在return a + b;} }運(yùn)行結(jié)果(注意執(zhí)行順序!):
靜態(tài)代碼塊 構(gòu)造方法 構(gòu)造方法 ret = 2十、方法重載:overload
同一個(gè)類中,同名不同參的方法成為重載方法(在上文類的構(gòu)造方法與可重載中有大量的例子。)
多數(shù)程序設(shè)計(jì)語言(C語言)要求為每個(gè)方法(函數(shù))提供一個(gè)獨(dú)一無二的方法名,不存在方法重載的概念。而在java中,規(guī)定方法簽名是解析方法的規(guī)則而不是方法名,為方法重載開創(chuàng)了條件。
方法重載使得在一個(gè)類中,方法名相同而參數(shù)列表不同的方法可同時(shí)存在,代表相似的行為或功能。
注意:僅有返回值不同的方法不能成為重載
System.out.print下面有很多的構(gòu)造方法,也就是方法的重載
十一、包:package
標(biāo)準(zhǔn)java庫是由一系列包組成,包括java.lang ,java.util,java.net等等。
java.lang
java語言的核心,它提供了java中的基礎(chǔ)類。包括基本Object類、Class類、String類、基本類型的包裝類、基本的數(shù)學(xué)類等等最基本的類。
java.net
和網(wǎng)絡(luò)相關(guān)
java.util
集合類、時(shí)間處理模式、日期時(shí)間工具等各類常用工具包
打包的意義:
1、java的包是為了更好地規(guī)劃代碼,防止命名沖突和混亂。所以java出現(xiàn)了打包機(jī)制。
2、當(dāng)把類組織起來放進(jìn)一個(gè)包內(nèi)時(shí),也就給包中的成員賦予了相互訪問的權(quán)限
package —— 聲明包
java程序員都可以編寫屬于自己的java包,為了保證包名唯一性,要求程序員在自己定義包的名字前加上唯一前綴。
由于互聯(lián)網(wǎng)上的域名名稱不會(huì)重復(fù),所以推薦采用公司在互聯(lián)網(wǎng)上的域名的倒置作為包的唯一前綴,如 com.iotek.ch09(倒置,當(dāng)然這也不是絕對的啦)
一個(gè)類可以使用同一個(gè)包中的所有類
一個(gè)類可以使用其他包中的所有公開類
怎樣使用其他包中的公開類?
①在每個(gè)類的簽名之前加上完整包名,例如:
java.util.Data today = new java.util.Date();- 1
②更簡潔更通用的方式:使用import語句來導(dǎo)包(ctrl +shift +O快捷導(dǎo)入)
import java.util.Date- 1
實(shí)際地去做一個(gè)包
一個(gè)類可以使用同一個(gè)包中的所有類,不同包之間記得前面加上public
同一個(gè)工程中盡量避免出現(xiàn)兩個(gè)完全一樣的類名。容易混淆,雖然有解決的辦法(導(dǎo)包)。
同一個(gè)類、同一個(gè)包、同一個(gè)工程。
總結(jié)
以上是生活随笔為你收集整理的Java面向对象(1) —— 封装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获得经纬度
- 下一篇: Java面向对象(2) —— 继承