Java面向?qū)ο蟮姆庋b你了解嗎
面向?qū)ο笏枷胫庋b
或許大家都聽(tīng)說(shuō)過(guò)java是純面向?qū)ο笳Z(yǔ)言,面向?qū)ο笏枷胍簿褪俏覀兂Uf(shuō)的OOP,我們聽(tīng)說(shuō)最多的思想就是繼承,封裝,多態(tài),今天我們來(lái)講一講封裝。
什么是封裝呢?
封裝就是一種將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,一種函數(shù)抽象類的接口實(shí)現(xiàn)了對(duì)細(xì)節(jié)的封裝和隱藏,使得我們只需要調(diào)用對(duì)外開(kāi)放的公共接口去實(shí)現(xiàn)與對(duì)象的交互。我們可以把封裝理解為一種保護(hù)的屏障,需要一些嚴(yán)格的接口進(jìn)行控制,我們可以修改自己實(shí)現(xiàn)類的內(nèi)部結(jié)構(gòu)的代碼,但是不可以修改那些公共接口。這就提供更好的安全性。
封裝的好處意義
- 好的封裝能夠減少耦合度
- 能夠?qū)Τ蓡T變量更精準(zhǔn)的控制
- 實(shí)現(xiàn)對(duì)細(xì)節(jié)的封裝和隱藏,使得更具有安全性。
- 可以修改類的內(nèi)部代碼,不用修改那些公共的接口
講到封裝那必然講到關(guān)鍵字private也就是訪問(wèn)修飾限定符。
回憶一下我們見(jiàn)過(guò)哪些訪問(wèn)修飾限定符呢?有public ,還有成員變量什么也不加的默認(rèn)權(quán)限英文是default,還有就是我們今天要講解的private,下一篇文章會(huì)講解protected。
那private到底有什么用處呢?
我們?cè)趤?lái)回憶一下上篇文章講過(guò)的類和對(duì)象,下面我會(huì)創(chuàng)建一個(gè)學(xué)生類。
//創(chuàng)建一個(gè)學(xué)生類
class Student {
public String name;//學(xué)生姓名
public int age;//學(xué)生年齡
public String sex;//學(xué)生性別
public double score;//學(xué)生分?jǐn)?shù)
public void sleep() {
System.out.println("我要睡覺(jué)了?。?!");
}
public void eat() {
System.out.println("我要干飯了?。?!");
}
public void exam() {
System.out.println("我要考試了!??!");
}
}
public class TestDemo {
public static void main(String[] args) {
Student student = new Student();//利用new關(guān)鍵字實(shí)例化一個(gè)對(duì)象
student.age = 19;
student.name = "厚積薄發(fā)";
student.score = 99.9;
student.sex = "男";
}
}以上的代碼我們將這個(gè)學(xué)生成員變量分別賦值。這樣寫會(huì)不會(huì)有什么不足呢?
想一想,如果我們每次要定義一個(gè)學(xué)生對(duì)象,每次都要這樣賦值會(huì)不會(huì)有點(diǎn)太麻煩?今天我們講到封裝就會(huì)讓它更簡(jiǎn)單一些。請(qǐng)看下面代碼:
class Student {
private String name;//學(xué)生姓名
private int age;//學(xué)生年齡
private String sex;//學(xué)生性別
private double score;//學(xué)生分?jǐn)?shù)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class TestDemo {
public static void main(String[] args) {
Student student = new Student();
student.setName("厚積薄發(fā)");
System.out.println(student.getName());
}
}根據(jù)封裝的概念我是不是可以給它封裝成一個(gè)公共的接口然后調(diào)用。
好接下來(lái)分析一下這個(gè)代碼:



所以,我們?cè)诔蓡T變量前面加上private修飾使得成員變量只能在類的內(nèi)部訪問(wèn),不能在類的外部訪問(wèn),然后我們實(shí)現(xiàn)了setName getName方法,調(diào)用者兩個(gè)接口就可以進(jìn)行初始化和返回值操作,更好地體現(xiàn)了封裝性。
getter方法和setter方法
為了更方便的調(diào)用這些接口,IDEA會(huì)為我們提供了這些接口,我們通常情況下把這些方法叫做getter方法和setter方法。只要我們需要我們就可以調(diào)用這些共有的getter方法和setter方法。
IDEA快捷鍵:Alt + insert

class Student {
private String name;//學(xué)生姓名
private int age;//學(xué)生年齡
private String sex;//學(xué)生性別
private double score;//學(xué)生分?jǐn)?shù)
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public void sleep() {
System.out.println("我要睡覺(jué)了!?。?);
}
public void eat() {
System.out.println("我要干飯了!??!");
}
public void exam() {
System.out.println("我要考試了!??!");
}
}
public class TestDemo {
public static void main(String[] args) {
Student student = new Student();//利用new關(guān)鍵字實(shí)例化一個(gè)對(duì)象
student.setName("厚積薄發(fā)");
student.setAge(19);
student.setScore(99.9);
student.setSex("male");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getScore());
System.out.println(student.getSex());
}
}toString方法
此外,我們每個(gè)成員變量都要自己實(shí)現(xiàn)一遍打印操作,沒(méi)錯(cuò)IDEA編譯器又為我們提供了一個(gè)方法,這個(gè)方法叫做toString方法,快捷鍵是 Alt +insert然后選擇toString方法。

我們直接打印對(duì)象的引用就可以調(diào)用toString方法.
有同學(xué)就會(huì)問(wèn)為什么呢?
這就得需要我們看一看println的源碼是怎么實(shí)現(xiàn)的了。
我們按住ctrl 點(diǎn)進(jìn)println這個(gè)方法

我們通過(guò)源碼就可以發(fā)現(xiàn),println會(huì)調(diào)用toString方法,如果定義了toString方法,那他就調(diào)用toString方法,如果沒(méi)有調(diào)用他就會(huì)打?。?/strong>

eg:

快捷鍵: Alt + insert 選擇constructor

總結(jié):
private關(guān)鍵字:利用private修飾的成員變量和方法只能在本類中訪問(wèn),如果在外部訪問(wèn)可以調(diào)用公有的setter方法和getter方法。
封裝的優(yōu)點(diǎn):減少代碼的耦合性 , 可以自由修改自己的內(nèi)部類,不用修改公有地接口 ,隱藏信息實(shí)現(xiàn)細(xì)節(jié),更精準(zhǔn)的控制成員變量。
要記住并且運(yùn)用并且調(diào)用這些公共的接口:getter方法和setter方法 還有toString方法以及 構(gòu)造方法。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java8?CompletableFuture?runAsync學(xué)習(xí)總結(jié)submit()?execute()等
這篇文章主要介紹了Java8?CompletableFuture?runAsync學(xué)習(xí)總結(jié)submit()?execute()等,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
關(guān)于logback日志級(jí)別動(dòng)態(tài)切換的四種方式
這篇文章主要介紹了關(guān)于logback日志級(jí)別動(dòng)態(tài)切換的四種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
用Java打造簡(jiǎn)易計(jì)算器的實(shí)現(xiàn)步驟
這篇文章主要介紹了如何設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Java命令行計(jì)算器程序,該程序能夠執(zhí)行基本的數(shù)學(xué)運(yùn)算(加、減、乘、除),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解
上次我們說(shuō)到View的Mearsure流程,今天接著說(shuō)說(shuō)layout. 關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來(lái)看看吧,需要的朋友可以參考下2021-05-05

