封裝是面向?qū)ο蟮娜筇卣髦弧?/p>
Java中的封裝的實(shí)質(zhì)就是將類和狀態(tài)信息(成員變量)隱藏在類的內(nèi)部空入,不允許外部程序直接訪問(wèn),而是通過(guò)該類提供的方法來(lái)實(shí)現(xiàn)對(duì)隱藏信息(成員變量)的操作和訪問(wèn)歪赢。
1.為什么要封裝
封裝是為了保護(hù)數(shù)據(jù),這里的數(shù)據(jù)是指對(duì)象的屬性(是成員變量埋凯,不是方法的局部變量)。
1.1.保護(hù)數(shù)據(jù)中的保護(hù)是什么意思扫尖?
保護(hù)是指對(duì)數(shù)據(jù)的讀寫(xiě)權(quán)限。
1.2.保護(hù)是如何實(shí)現(xiàn)的藏斩?或者說(shuō)封裝是如何實(shí)現(xiàn)的?
通過(guò)訪問(wèn)修飾符實(shí)現(xiàn)的狰域。
2.訪問(wèn)修飾符
訪問(wèn)修飾符共有四個(gè):
- public:公共的
- protected:受保護(hù)的
- 默認(rèn)|default(什么都不寫(xiě))
- private:私有的
2.1.封裝之public
被public修飾的成員變量和成員方法可以在所有類中訪問(wèn)黄橘。
public修飾的屬性沒(méi)有訪問(wèn)限制屈溉,是最寬松的封裝塞关。
例如
public class Person {
public String name;//公有
}
name可以在任何地方被訪問(wèn)呢子巾,也就是可以讀和寫(xiě)
- pubilc修飾類:類可以在任何地方被訪問(wèn)
- public修飾屬性和方法:屬性和方法可以在任何地方被訪問(wèn)
2.2.封裝之private
private修飾的成員變量和成員方法只能在聲明它們的類中訪問(wèn)帆赢,而不能在其他類(包括子類)中訪問(wèn)线梗。
private修飾的屬性只能在類內(nèi)被訪問(wèn)椰于,類外無(wú)法訪問(wèn)仪搔,是最嚴(yán)格的封裝。
例如:
public class Person {
private String name;//私有
}
name屬性只能在Person類的類內(nèi)使用烤咧,類外無(wú)法使用偏陪。
- private不能修飾類
private class Classinfo{//報(bào)錯(cuò)煮嫌,private不能修飾類
}
public class Student {
}
- private可以修飾類的成員,無(wú)論類的成員是什么昌阿。
public class Student {
int age;
private class Classinfo{//不報(bào)錯(cuò),因?yàn)镃assinfo類是Student類的成員
}
}
2.3.## 封裝之default(默認(rèn)訪問(wèn)修飾符)
默認(rèn)訪問(wèn)修飾符是指什么都不寫(xiě)宝泵。
默認(rèn)訪問(wèn)修飾符修飾的類,屬性儿奶,方法可以在同包中的類訪問(wèn)框往。
- default可以修飾類闯捎,也可以修飾屬性椰弊,方法瓤鼻。
class Student {//Student類是默認(rèn)訪問(wèn)修飾符
String name; //name是默認(rèn)訪問(wèn)修飾符
Student(String name){ //構(gòu)造函數(shù)是默認(rèn)訪問(wèn)修飾符
}
void sayHello(){//sayHello方法是默認(rèn)訪問(wèn)修飾符
}
}
2.4.封裝之protected
protected是為繼承而設(shè)計(jì)的訪問(wèn)修飾符。
被protected修飾的屬性或方法在子類中一定可以訪問(wèn)茬祷。無(wú)論子類是否與父類在一個(gè)包里。同包也可以訪問(wèn)。
package com.sunmer.tmp;
public class Father {
protected int age;
int weight;
}
package com.sunmer.tmp;
public class Sub1 extends Father{
public static void main(String[] args) {
Sub1 sub1 = new Sub1();
sub1.age= 1;//可以訪問(wèn)
sub1.weight = 1;//可以訪問(wèn)
}
}
package com.sunmer.oop;
import com.sunmer.tmp.Father;
public class Sub2 extends Father {
public static void main(String[] args) {
Sub2 sub2 = new Sub2();
sub2.age = 0;//可以訪問(wèn)
}
}
package com.sunmer.oop;
import com.sunmer.tmp.Father;
public class Sub3 extends Sub2 {
public static void main(String[] args) {
Sub2 sub2 =new Sub2();
sub2.age = 0;//不可訪問(wèn)
Sub3 sub3 =new Sub3();
sub3.age = 0;//可以訪問(wèn)
}
}
※封裝的總結(jié)
訪問(wèn)修飾符 | 解釋 |
---|---|
public | 無(wú)限制 |
protected | 同包 | 子類 |
默認(rèn) | 同包 |
private | 同類 |
關(guān)于面向?qū)ο蟮钠渌麅纱筇卣鲗⒃谙乱黄恼逻M(jìn)行講解滚停。