Java三大特性之封裝詳解
封裝概述
概述
面向?qū)ο缶幊陶Z(yǔ)言是對(duì)客觀世界的模擬,客觀世界里成員變量都是隱藏在對(duì)象內(nèi)部的,外界無(wú)法直接操作和修改。 封裝可以被認(rèn)為是一個(gè)保護(hù)屏障,防止該類(lèi)的代碼和數(shù)據(jù)被其他類(lèi)隨意訪問(wèn)。要訪問(wèn)該類(lèi)的數(shù)據(jù),必須通過(guò)指定的方式。適當(dāng)?shù)姆庋b可以讓代碼更容易理解與維護(hù),也加強(qiáng)了代碼的安全性。
原則
將屬性隱藏起來(lái),若需要訪問(wèn)某個(gè)屬性,提供公共方法對(duì)其訪問(wèn)。
封裝的步驟
- 使用 private 關(guān)鍵字來(lái)修飾成員變量。
- 對(duì)需要訪問(wèn)的成員變量,提供對(duì)應(yīng)的一對(duì) getXxx 方法 、setXxx 方法。
封裝的操作—private關(guān)鍵字
private的含義
- private是一個(gè)權(quán)限修飾符,代表最小權(quán)限。
- 可以修飾成員變量和成員方法。
- 被private修飾后的成員變量和成員方法,只在本類(lèi)中才能訪問(wèn)。
private的使用格式
private 數(shù)據(jù)類(lèi)型 變量名 ;
1.使用 private 修飾成員變量,代碼如下:
public class Student { // 成員變量 private String name; private int age; }
2.提供 getXxx 方法 / setXxx 方法,可以訪問(wèn)成員變量,代碼如下:
public class Student { // 成員變量 private String name; private int age; // Getter Setter public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; } }
封裝優(yōu)化1—this關(guān)鍵字
我們發(fā)現(xiàn) setXxx 方法中的形參名字并不符合見(jiàn)名知意的規(guī)定,那么如果修改與成員變量名一致,是否就見(jiàn)名知意 了呢?代碼如下:
public void setName(String name) { name = name; } public void setAge(int age) { age = age; }
經(jīng)過(guò)修改和測(cè)試,我們發(fā)現(xiàn)新的問(wèn)題,成員變量賦值失敗了。也就是說(shuō),在修改了setXxx() 的形參變量名后,方 法并沒(méi)有給成員變量賦值!這是由于形參變量名與成員變量名重名,導(dǎo)致成員變量名被隱藏,方法中的變量名,無(wú)法訪問(wèn)到成員變量,從而賦值失敗。所以,我們只能使用this關(guān)鍵字,來(lái)解決這個(gè)重名問(wèn)題。
this的含義
this代表所在類(lèi)的當(dāng)前對(duì)象的引用(地址值),即對(duì)象自己的引用。 記住 :方法被哪個(gè)對(duì)象調(diào)用,方法中的this就代表那個(gè)對(duì)象。即誰(shuí)在調(diào)用,this就代表誰(shuí)。
this使用格式
this.成員變量名;
使用 this 修飾方法中的變量,解決成員變量被隱藏的問(wèn)題,代碼如下:
public class Student { // 成員變量 private String name; private int age; // Getter Setter public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
小貼士:方法中只有一個(gè)變量名時(shí),默認(rèn)也是使用 this 修飾,可以省略不寫(xiě)。
封裝優(yōu)化2—構(gòu)造方法
當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí)候,構(gòu)造方法用來(lái)初始化該對(duì)象,給對(duì)象的成員變量賦初始值。
小貼士:無(wú)論你與否自定義構(gòu)造方法,所有的類(lèi)都有構(gòu)造方法,因?yàn)镴ava自動(dòng)提供了一個(gè)無(wú)參數(shù)構(gòu)造方法,一旦自己定義了構(gòu)造方法,Java自動(dòng)提供的默認(rèn)無(wú)參數(shù)構(gòu)造方法就會(huì)失效。
構(gòu)造方法的定義格式
修飾符 構(gòu)造方法名(參數(shù)列表){ // 方法體 }
構(gòu)造方法的寫(xiě)法上,方法名與它所在的類(lèi)名相同。它沒(méi)有返回值,所以不需要返回值類(lèi)型,甚至不需要void。使用構(gòu)造方法后,代碼如下:
public class Student { // 成員變量 private String name; private int age; // 無(wú)參數(shù)的構(gòu)造方法 public Student() { System.out.println("無(wú)參構(gòu)造方法執(zhí)行啦!"); } // 全參數(shù)的構(gòu)造方法 public Student(String name, int age) { System.out.println("全參構(gòu)造方法執(zhí)行啦!"); this.name = name; this.age = age; } }
注意事項(xiàng)
- 如果你不提供構(gòu)造方法,系統(tǒng)會(huì)給出無(wú)參數(shù)構(gòu)造方法。
- 如果你提供了構(gòu)造方法,系統(tǒng)將不再提供無(wú)參數(shù)構(gòu)造方法。
- 構(gòu)造方法是可以重載的,既可以定義參數(shù),也可以不定義參數(shù)。
標(biāo)準(zhǔn)代碼—JavaBean
JavaBean 是 Java語(yǔ)言編寫(xiě)類(lèi)的一種標(biāo)準(zhǔn)規(guī)范。符合JavaBean 的類(lèi),要求類(lèi)必須是具體的和公共的,并且具有無(wú) 參數(shù)的構(gòu)造方法,提供用來(lái)操作成員變量的set 和get 方法。
public class ClassName{ //成員變量 //構(gòu)造方法 //無(wú)參構(gòu)造方法【必須】 //有參構(gòu)造方法【建議】 //成員方法 //getXxx() //setXxx() }
編寫(xiě)符合JavaBean 規(guī)范的類(lèi),以學(xué)生類(lèi)為例,標(biāo)準(zhǔn)代碼如下:
public class Student { // 成員變量 private String name; private int age; // 無(wú)參數(shù)的構(gòu)造方法 public Student() { System.out.println("無(wú)參構(gòu)造方法執(zhí)行啦!"); } // 全參數(shù)的構(gòu)造方法 public Student(String name, int age) { System.out.println("全參構(gòu)造方法執(zhí)行啦!"); this.name = name; this.age = age; } // Getter Setter public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
到此這篇關(guān)于Java三大特性之封裝詳解的文章就介紹到這了,更多相關(guān)Java封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MybatisPlus如何調(diào)用count函數(shù)
這篇文章主要介紹了MybatisPlus如何調(diào)用count函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08JavaCV實(shí)戰(zhàn)之調(diào)用攝像頭基礎(chǔ)詳解
這篇文章主要介紹了使用JavaCV框架對(duì)攝像頭進(jìn)行各種處理的基礎(chǔ)理論詳解,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaCV有一定的幫助,需要的可以了解一下2022-01-01詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例
這篇文章主要介紹了詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例,文中分別介紹了快排時(shí)兩種區(qū)間劃分的思路,需要的朋友可以參考下2016-04-04SpringMVC框架整合Junit進(jìn)行單元測(cè)試(案例詳解)
本文詳細(xì)介紹在SpringMVC任何使用Junit框架。首先介紹了如何引入依賴(lài),接著介紹了編寫(xiě)一個(gè)測(cè)試基類(lèi),并且對(duì)其中涉及的各個(gè)注解做了一個(gè)詳細(xì)說(shuō)明,感興趣的朋友跟隨小編一起看看吧2021-05-05java實(shí)現(xiàn)往hive 的map類(lèi)型字段寫(xiě)數(shù)據(jù)
這篇文章主要介紹了java實(shí)現(xiàn)往hive 的map類(lèi)型字段寫(xiě)數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Spring中的@ConditionalOnProperty作用和用法詳解
這篇文章主要介紹了Spring中的@ConditionalOnProperty作用和用法詳解,在spring boot中有時(shí)候需要控制配置類(lèi)是否生效,可以使用@ConditionalOnProperty注解來(lái)控制@Configuration是否生效,需要的朋友可以參考下2023-11-11淺析Java的Hibernate框架中的繼承關(guān)系設(shè)計(jì)
這篇文章主要介紹了Java的Hibernate框架中的繼承關(guān)系設(shè)計(jì),Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12