封裝的基礎(chǔ)實(shí)現(xiàn)
在Java中所有面向?qū)ο蟮母拍疃际且灶惻c對象的關(guān)系為主的,那么首先我們通過一個(gè)例子解釋為什么需要提供封裝性
觀察如下代碼:
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+",年齡:"+age);
}
}
public class MyClass {
public static void main(String[] args){
Person person = new Person();
person.name = "張三";
person.age = -30;
person.tell();
}
}
- 運(yùn)行結(jié)果:
姓名:張三,年齡:-30 - 此時(shí)的代碼沒有語法錯(cuò)誤,但是從現(xiàn)實(shí)的角度來講,這個(gè)代碼是有錯(cuò)誤的且問題嚴(yán)重(年齡:-30)。這樣的錯(cuò)誤嚴(yán)格來講屬于業(yè)務(wù)錯(cuò)誤
- 錯(cuò)誤原因在于當(dāng)前類的屬性可以直接被類外部的對象調(diào)用,所以此時(shí)我們認(rèn)為這樣的操作是屬于不安全的操作。因此需要解決的問題是將內(nèi)部的屬性保護(hù)起來,即:不讓外部直接操作,為此在Java中提供了
private關(guān)鍵字,利用此關(guān)鍵字可以實(shí)現(xiàn)封裝
封裝性代碼如下:
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+",年齡:"+age);
}
}
加入private之后,就表示此時(shí)name和age兩個(gè)屬性只能夠被Person類訪問
- 現(xiàn)在發(fā)現(xiàn),使用了
private定義的屬性,類的外部不能夠直接訪問,所以安全性是最高的 - 如果現(xiàn)在需要通過對象操作類中的屬性,在Java中就有了一個(gè)明確的要求:可以使用
setter、getter方法取得封裝性內(nèi)容,以private String name;為例:
設(shè)置數(shù)據(jù):public void setName(String n);
取得數(shù)據(jù):public String getName();
使得外部可以訪問:
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+",年齡:"+age);
}
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
public void setAge(int n){
if (age >0 && age < 200){
age = n;
}
}
public int getAge(){
return age;
}
}
public class MyClass {
public static void main(String[] args){
Person person = new Person();
person.setName("張三");
person.setAge(30);
person.tell();
}
}
此時(shí)經(jīng)過封裝后,外界訪問屬性需設(shè)置符合現(xiàn)實(shí)規(guī)律的值才可以顯示(0<age<200),否則無法得到想要的結(jié)果
:只要是類中的屬性應(yīng)使用
private封裝,封裝后的屬性必須嚴(yán)格按照要求編寫setter、getter方法
總結(jié):
-
private聲明的屬性只能夠被類的內(nèi)部所訪問 -
private聲明的屬性必須有對應(yīng)的setter、getter方法,而且方法名稱要求按照嚴(yán)格標(biāo)準(zhǔn)編寫