封裝在java中有兩種表現(xiàn)
創(chuàng)新互聯(lián)主營(yíng)囊謙網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App定制開發(fā),囊謙h5微信小程序搭建,囊謙網(wǎng)站營(yíng)銷推廣歡迎囊謙等地區(qū)企業(yè)咨詢
1.用類封裝一個(gè)事物的屬性和方法。
2.用方法來(lái)封裝一個(gè)固定的算法。
樓上所說(shuō)的其實(shí)是封裝的程度不一樣,在面向?qū)ο蟮男g(shù)語(yǔ)中粒度來(lái)表示這個(gè)程度。
封裝其實(shí)是要看情況而定的,如果你這個(gè)類是描述人的,需要這個(gè)人完成一些基本的動(dòng)作,如吃飯,走路,那么就不用把細(xì)胞也封裝進(jìn)來(lái)。但是如果“人”這個(gè)類,需要做醫(yī)學(xué)的研究用,那么就需要封裝細(xì)胞這個(gè)屬性了。
代碼打多了就自然能理解了,不是一個(gè)復(fù)雜的概念。呵呵。
說(shuō)給人家聽,我們就說(shuō)的通俗簡(jiǎn)單點(diǎn): 代碼封裝的好處:第一點(diǎn)在于安全,JAVA中類的一個(gè)屬性,我們一般會(huì)在類中將其私有化然后getter和setter方法對(duì)外提供得到和設(shè)置的方法,這就好比自動(dòng)存提款機(jī),錢就是我們要的屬性,要的數(shù)據(jù),放在那直接去拿可以嗎?很明顯不行,所以自動(dòng)存提款機(jī)提供了取錢的方法和存錢方法,而你不用知道錢從哪來(lái)要到哪里去。第二點(diǎn)在于方便:方法也是封裝的一種體現(xiàn),有一個(gè)功能我們要反復(fù)調(diào)用,每次寫同樣的代碼嗎?答案很明顯,不要!,我們寫個(gè)方法,把這段功能代碼封裝成一個(gè)方法,需要的時(shí)候調(diào)用方法名就可以了,不是嗎? 關(guān)于package:如果一個(gè)項(xiàng)目很大的話,會(huì)分成很多小組,每個(gè)小組會(huì)有很多開發(fā)人員,大家在編寫代碼時(shí)說(shuō)不定會(huì)出現(xiàn)同樣的類名,問(wèn)題就來(lái)了,我在調(diào)類的時(shí)候,調(diào)的是哪個(gè)?所以每個(gè)小組用不同的包名,這樣來(lái)區(qū)分類所在的位置。好,如果你說(shuō)項(xiàng)目編碼之前詳細(xì)設(shè)計(jì)說(shuō)的很清楚了,類不可能出現(xiàn)同名,那么包的另外一個(gè)好處在于相似用途的類放在一個(gè)包下可以方便管理和查找,比如java.util包,如查沒(méi)有包的存在,我想查API看有哪些集合框架,你說(shuō)方便不 權(quán)限修飾符的作用就是:你很有錢,你愿意告訴誰(shuí)你很有錢需要的時(shí)候可以來(lái)找你,你的親屬?你的兒子?還是全世界的所有人?你自己有必要告訴誰(shuí) 那么他們?nèi)卞X的時(shí)候就會(huì)想到你
封裝就是隱藏實(shí)現(xiàn)細(xì)節(jié)
將屬性私有化
提供公有方法訪問(wèn)私有屬性。
類是基于面向?qū)ο笏枷刖幊陶Z(yǔ)言的基礎(chǔ)
程序員可以把具有相同業(yè)務(wù)性質(zhì)的代碼封裝到一個(gè)類里
通過(guò)接口方法向外部代碼提供服務(wù)
同時(shí)向外部代碼屏蔽類里服務(wù)的具體實(shí)現(xiàn)方式。對(duì)象是類的實(shí)例
類一般是個(gè)抽象名詞
比如“人類”
而對(duì)象則是具體的物質(zhì)存在
比如“張三”
這個(gè)人。在現(xiàn)實(shí)生活中
經(jīng)常會(huì)遇到“類”
和“對(duì)象”
這些概念
比如封裝了能實(shí)現(xiàn)“全自動(dòng)洗衣機(jī)”
功能的洗衣機(jī)類。這里
用戶可以使用面板上的按鈕
使用該類里提供的洗衣等服務(wù)并且
由于該類實(shí)現(xiàn)了封裝
所以在使用的時(shí)候
用戶可以不用了解其中的自動(dòng)洗衣原理以及實(shí)現(xiàn)機(jī)制。
類是同一種類型的對(duì)象的抽象
是某種類型對(duì)象的概述和定義
而對(duì)象則是某個(gè)類的實(shí)例化結(jié)果或者叫一種類型的實(shí)體。在使用面向?qū)ο蟮乃枷脒M(jìn)行軟件開發(fā)的過(guò)程中
首先得抽出項(xiàng)目的實(shí)體-對(duì)象模型
即首先是實(shí)體類的定義、封裝。
這段代碼也是醉了,你存入list應(yīng)該是一個(gè)對(duì)象Person,
而你給一組數(shù)組賦值我也是沒(méi)搞懂你的意思,
你這樣寫代碼能存入list集合的只是一個(gè)Person對(duì)象,而你給對(duì)象字段賦值的語(yǔ)句就只有p.name = s.next();?p.pingjun = (rr / (a.length - 1)) + "";,只有2個(gè)屬性付了值,其他的沒(méi)有賦值是null;
一個(gè)構(gòu)造器給Person的數(shù)組賦值?一個(gè)長(zhǎng)度20的字符空數(shù)組,然后你給w數(shù)組賦值,那么你這樣子賦值你以為可以影響到Person的值?w[i] = u + "";這句代碼,與Person對(duì)象沒(méi)半毛錢關(guān)系,對(duì)象引用都沒(méi)有怎么賦值,
你最后打印的是Person對(duì)象的字段,而你存入一個(gè)空數(shù)組,然后把string類型字段的原始屬性給一個(gè)數(shù)組,Person(String r[]) {
r[1] = this.yuwen;
r[2] = this.shuxve;
r[3] = this.wuli;
r[4] = this.waiyu;
r[5] = this.huaxve;
}
這有啥用,我很好奇你這個(gè)r數(shù)組也不是類中的字段,你給他付了null的值,你給他傳入的是長(zhǎng)度20的數(shù)組,后面還有15個(gè)長(zhǎng)度呢,不管這個(gè),關(guān)鍵是這個(gè)數(shù)組啥用也沒(méi)有除了浪費(fèi)內(nèi)存
下面這段代碼中l(wèi)ist.add(p);,你把Person 對(duì)象存入list,此時(shí)的Person 對(duì)象被賦值的就只有2個(gè)字段,你給w,r數(shù)組的值無(wú)法影響到Person 對(duì)象,且這個(gè)方法執(zhí)行完畢后,也會(huì)被清理掉因?yàn)闆](méi)有被引用到
這個(gè)時(shí)候可以回答你的問(wèn)題了,為什么你輸入的分?jǐn)?shù)顯示都是null:
因?yàn)樗紱](méi)被賦值到Person 的成員變量上面,沒(méi)被賦值的成員變量的String值是null,容易你打印Person 未被賦值的成員變量的值,就是null;
String r[] = new String[a.length - 2];
String w[] = new String[20];
int rr = 0;
Person p = new Person(w);
p.name = s.next();
for (int i = 1; i a.length - 1; i++) {
int u = s.nextInt();
w[i] = u + "";
r[i - 1] = u + "";
rr += u;
}
p.pingjun = (rr / (a.length - 1)) + "";
list.add(p);
public class Man {
//這里是對(duì)屬性的封裝,一個(gè)人的姓名,年齡,妻子都是這個(gè)對(duì)象(人)的私有屬性
private String name;
private int age;
private Woman wife;
//這里是對(duì)改人對(duì)外界提供方法的封裝,可以設(shè)置改男人的妻子,姓名,年齡也可以獲取改男人的姓名和年齡
public void setWife(Woman wife) {
this.wife = wife;
}
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 class Woman {
//同樣這里是屬性封裝
private String name;
private int age;
private Man husband;
//方法封裝
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 Man getHusband() {
return husband;
}
public void setHusband(Man husband) {
this.husband = husband;
}
}
/**
* 仔細(xì)看就會(huì)發(fā)現(xiàn),Man類沒(méi)有提供getWife的方法,這是以為男人不想讓自己的妻子被外界訪問(wèn),
*
* 直接下來(lái)呢,就是封裝可以吧一個(gè)對(duì)象的屬性私有,而提供一些可以被外界訪問(wèn)的屬性的方法,
*
* 比如說(shuō),name屬性,Man和Woman類都有相應(yīng)的get和set方法,外界都可以通過(guò)這些方法訪問(wèn)和修改
*
* 同時(shí)對(duì)一些改對(duì)象不想讓外界訪問(wèn)的屬性,就不提供其方法,比如說(shuō)Man的wife屬性,就沒(méi)有g(shù)et方法
*
* 外界是不能帶到Man類的wife屬性的
*
* 呵呵
* 奇怪的是Woman類有husband的get方法,這就是封裝的一點(diǎn),還有的其他朋友也說(shuō)到了
*/