13. Java類中的封裝
1秃诵、Java類中的封裝
學(xué)習(xí)了訪問(wèn)權(quán)限修飾符后,應(yīng)該可以理解封裝性的概念和含義。封裝性是面向?qū)ο笕筇卣髦?封裝性是一種信息隱藏技術(shù)
2槽卫、封裝的概念
在面向?qū)ο蟪淌皆O(shè)計(jì)方法中,封裝(英語(yǔ):Encapsulation)是指一種將抽象性函式接口的實(shí)現(xiàn)細(xì)節(jié)部分包裝胰蝠、隱藏起來(lái)的方法歼培。
封裝可以被認(rèn)為是一個(gè)保護(hù)屏障震蒋,防止該類的代碼和數(shù)據(jù)被外部類定義的代碼隨機(jī)訪問(wèn)。
要訪問(wèn)該類的代碼和數(shù)據(jù)躲庄,必須通過(guò)嚴(yán)格的接口控制查剖。
封裝最主要的功能在于我們能修改自己的實(shí)現(xiàn)代碼,而不用修改那些調(diào)用我們代碼的程序片段噪窘。
適當(dāng)?shù)姆庋b可以讓程式碼更容易理解與維護(hù)笋庄,也加強(qiáng)了程式碼的安全性。
3效览、兩個(gè)含義:
-對(duì)象的全部屬性和全部方法結(jié)合在一起无切,形成一個(gè)不可分割的獨(dú)立單位 -盡可能隱藏對(duì)象的內(nèi)部結(jié)構(gòu)
4、具體表現(xiàn):
-屬性使用private權(quán)限 -方法使用public權(quán)限
5丐枉、封裝的優(yōu)點(diǎn)
- 良好的封裝能夠減少耦合哆键。
- 類內(nèi)部的結(jié)構(gòu)可以自由修改。
- 可以對(duì)成員變量進(jìn)行更精確的控制瘦锹。
- 隱藏信息籍嘹,實(shí)現(xiàn)細(xì)節(jié)。
6弯院、封裝的步驟
修改屬性的可見(jiàn)性來(lái)限制對(duì)屬性的訪問(wèn)(一般限制為private)
對(duì)每個(gè)值屬性提供對(duì)外的公共方法訪問(wèn)辱士,也就是創(chuàng)建一對(duì)賦取值方法,用于對(duì)私有屬性的訪問(wèn)
重寫從父類Object繼承下來(lái)的toString()方法听绳,來(lái)輸出自己想要的信息颂碘。
重寫從父類Object繼承的hashCode()方法,計(jì)算hashCode值椅挣,hashCode值主要用來(lái)判斷對(duì)象的屬性是否相同头岔,進(jìn)行數(shù)組的排序。
重寫從父類Object繼承的equals()方法鼠证,判斷兩個(gè)對(duì)象屬性值是否完全相同峡竣。
示例:
package com.company.practice.demo;
public class User {
private String name;
private int age;
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;
}
}
完整代碼:
package com.company.practice.demo;
public class User {
private String name;
private int age;
public User() {
}
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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}