一勇皇、介紹
對(duì)象(object)是一件事、一個(gè)實(shí)體焚刺、一個(gè)名詞敛摘,可以獲得的東西,可以想象有自己的標(biāo)識(shí)的任何東西乳愉。對(duì)象是類的實(shí)例化兄淫。一些對(duì)象是活的,一些對(duì)象不是蔓姚。比如這輛汽車捕虽、這個(gè)人、這間房子坡脐、這張桌子薯鳍、這株植物、這張支票挨措、這件雨衣挖滤。 概括來(lái)說(shuō)就是:萬(wàn)物皆對(duì)象。對(duì)象需要由兩部分來(lái)描述:第一部分是它的“數(shù)據(jù)”浅役,包括對(duì)象的特性斩松、狀態(tài)等靜態(tài)信息;第二部分是它的“行為”觉既,包括該對(duì)象的操作惧盹、功能等能動(dòng)信息乳幸。
那么這節(jié)課呢,我們來(lái)了解的是對(duì)象的相關(guān)應(yīng)用钧椰,告訴我們?nèi)绾稳ナ褂梦覀儗?duì)象的屬性與方法粹断,比如我們有一個(gè)人類,他產(chǎn)生了一個(gè)對(duì)象張三嫡霞,那么我們就可以通過(guò)張三去使用張三的名字瓶埋,年齡等他的一些特性,除了這個(gè)以外诊沪,我們還會(huì)對(duì)張三的行為進(jìn)行引用养筒,如:唱歌,踢球端姚,玩游戲等晕粪。
二、知識(shí)點(diǎn)介紹
1渐裸、對(duì)象存儲(chǔ)
2巫湘、對(duì)象使用
3、對(duì)象生命周期
4昏鹃、對(duì)象比較
5剩膘、匿名對(duì)象
三、上課對(duì)應(yīng)視頻的說(shuō)明文檔
1盆顾、對(duì)象的存儲(chǔ)
對(duì)象的存儲(chǔ)在內(nèi)存中有地址與值,那么地址與值是使用棧與堆的形式存儲(chǔ)畏梆。那么我們先了解一下堆您宪,棧。
棧(stack)與堆(heap)都是Java用來(lái)在Ram中存放數(shù)據(jù)的地方奠涌。與C++不同宪巨,? Java自動(dòng)管理?xiàng):投眩绦騿T不能直接地設(shè)置椓锍或堆捏卓。
棧的優(yōu)勢(shì)是,存取速度比堆要快慈格,僅次于直接位于CPU中的寄存器怠晴。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的浴捆,缺乏靈活性蒜田。另外,棧數(shù)據(jù)可以共享选泻。
堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小冲粤,生存期也不必事先告訴編譯器美莫,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是梯捕,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存厢呵,存取速度較慢。
案例:
//堆是先進(jìn)先出,棧是先進(jìn)后出
Person p1=new Person();
如上圖:當(dāng)我們聲明完p1對(duì)象后傀顾,在內(nèi)存棧中襟铭,我們可以查看到p1的地址,在內(nèi)存堆中锣笨,我們可以看到我們類中的屬性與方法蝌矛。在使用對(duì)象時(shí),我們是先找到對(duì)象的棧地址错英,在找到堆中的實(shí)際內(nèi)容入撒。
(1) 基本類型
如上圖:當(dāng)我們聲明變量a時(shí),只是在內(nèi)存棧中開辟了一個(gè)直接存放內(nèi)容的空間椭岩。
(2) 引用類型
如上圖:當(dāng)我們聲明p對(duì)象時(shí)茅逮,在我們的內(nèi)存棧中,我們存入了對(duì)象的地址判哥,而這個(gè)地址献雅,指向的是我們內(nèi)存堆中的實(shí)際屬性,name和sex塌计,也就是說(shuō)挺身,我們通過(guò)內(nèi)存棧中的地址也就是對(duì)象,可以找到內(nèi)存堆中的name和sex這二個(gè)屬性的值“小明”和“boy”
2锌仅、對(duì)象的使用
創(chuàng)建新的對(duì)象之后,我們就可以使用“ 對(duì)象名.對(duì)象成員 ”的格式章钾,來(lái)訪問(wèn)對(duì)象的成員(包括屬性和方法)。
案例:
class TestPerson{
public static void main(String[] args){
Person p1 = new Person();
Person p2 =new Person();
p1.age = -30;
//不同的對(duì)象打印热芹,不同的值
p1.shout();?
p2.shout();
}
}
class Person{
int age=23;
public void shout(){
System.out.println(age);
}
}
如上例:在我們的主函數(shù)里贱傀,聲明了p1,p2二個(gè)對(duì)象,p1伊脓,p2對(duì)象分別在我們的內(nèi)存中開辟了二個(gè)不同的空間府寒,那么當(dāng)p1中的屬性age發(fā)生變化的時(shí)候,p2里面的age是不會(huì)受到影響的报腔。那么最后調(diào)用shout()方法的時(shí)候株搔,我們輸出的結(jié)果是p1的age是-30和p2的age是23。
(1) 對(duì)象創(chuàng)建
格式:
類名 對(duì)象名稱 = null;? ? ? ? //聲明對(duì)象?
對(duì)象名稱 = new 類型();? ? ? ? //實(shí)例化對(duì)象
class Person?
{?
String name;? ? ? ? ? ? ? ? ? ? ? ? //聲明姓名屬性?
int age;? ? ? ? ? ? ? ? ? ? ? ? ? ? //聲明年齡屬性?
public void tell()? ? ? ? ? ? ? ? ? //取得信息的方法?
{?
System.out.println("姓名:" + name + "纯蛾,年齡:" + age);? ? ? ? ?
}?
}?
public class ClassDemo02?
{?
public static void main(String[] args)?
{?
Person per = new person();? ? ? //創(chuàng)建并實(shí)例化對(duì)象?
}?
}?
(2) 訪問(wèn)屬性與方法
格式:
訪問(wèn)屬性:對(duì)象名稱.屬性名?
訪問(wèn)方法:對(duì)象名稱.方法名()?
class Person?
{?
String name;? ? ? ? ? ? ? ? ? ? ? ? //聲明姓名屬性?
int age;? ? ? ? ? ? ? ? ? ? ? ? ? ? //聲明年齡屬性?
public void tell()? ? ? ? ? ? ? ? ? //取得信息的方法?
{?
System.out.println("姓名:" + name + "邪狞,年齡:" + age);? ? ? ? ?
}?
}?
public class ClassDemo03?
{?
public static void main(String args[])?
{?
Person per = new Person();? ? ? ? ? ? ? //創(chuàng)建并實(shí)例化對(duì)象(非常重要)? ? ? ? ?
per.name = "張三";? ? ? ? ? ? ? ? ? ? //為name屬性賦值?
per.age = 30;? ? ? ? ? ? ? ? ? //為age屬性賦值?
per.tell();? ? ? ? ? ? ? ? ? ? //調(diào)用類中的方法?
}?
}?
3、對(duì)象的生命周期
(1)程序結(jié)束時(shí)茅撞,所有對(duì)象都回收
如上圖:產(chǎn)生了一個(gè)p1對(duì)象帆卓,當(dāng)整個(gè)程序結(jié)束執(zhí)行時(shí)巨朦,p1對(duì)象變成了垃圾,結(jié)束了他的生命周期剑令。
(2)當(dāng)對(duì)象為null時(shí)糊啡,對(duì)象變成垃圾
A、
如上圖:產(chǎn)生了一個(gè)p1對(duì)象吁津,在程序的運(yùn)行過(guò)程當(dāng)中棚蓄,p1賦值了null,那么p1在內(nèi)存棧中的地址就消失了,失去了地址的對(duì)象就變成了垃圾碍脏,等待著JVM的垃圾回收梭依。
B、
如上圖:產(chǎn)生了一個(gè)p1對(duì)象典尾,將p1對(duì)象的地址給了p2,表示的是p1和p2同時(shí)擁有了同一個(gè)地址役拴,他們同時(shí)指向了我們內(nèi)存堆中的內(nèi)容,當(dāng)我們把p1的地址賦什為null時(shí)钾埂,p2是不受影響的河闰,所以,p1變成了垃圾對(duì)象褥紫,而p2還是可以正常使用姜性。
4、對(duì)象的比較
A髓考、“= =”運(yùn)算符 部念,用于比較兩個(gè)變量(基本數(shù)據(jù)類型和引用數(shù)據(jù)類型變量)的值是否相等。
public class Test1{
public static void main(String args[]){
String s1=new String("abc");//產(chǎn)生字符串對(duì)象
String s2=new String("abc");
String s3=s1;//將s1的地址給了s3所以他二地址一樣
if(s1==s2){//比較具體的地址
System.out.pirntln("s1==s2");
}else{
System.out.println("s1!=s2");
}
if(s1==s3){
System.out.println("s1==s3");
}else{
System.out.println("s1!=s3");
}
}
}
B氨菇、equals()方法是String 類的一個(gè)成員方法儡炼,用于比較兩個(gè)引用變量所指向的對(duì)象的內(nèi)容是否相等。
public class Test1{
public static void main(String args[]){
String s1=new String("abc");
String s2=new String("abc");
String s3=s1;
if(s1.equals(s2)){//比較具體的值
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
if(s1.equals(s3)){
System.out.println("s1==s3");
}else{
System.out.println("s1!=s3");
}
}
}
5门驾、匿名對(duì)象
創(chuàng)建完對(duì)象后,在調(diào)用該對(duì)象的方法時(shí)多柑,可以不定義對(duì)象的引用變量奶是,而直接調(diào)用這個(gè)對(duì)象的方法。這樣的對(duì)象叫匿名對(duì)象竣灌。
Person p=new Person();
P. shout();
<=====>
new Person().shout();
匿名對(duì)象使用:
如果一個(gè)對(duì)象只需要一次方法調(diào)用聂沙,那么就可以使用匿名對(duì)象。
將匿名對(duì)象作為實(shí)參傳遞給一個(gè)函數(shù)調(diào)用初嘹,比如程序中有一個(gè)getSomeOne 函數(shù)及汉,要接收一個(gè)Person類對(duì)象作為參數(shù),函數(shù)定義如下:
public static void getSomeOne(Person p){
...
}
函數(shù)調(diào)用:
getSomeOne(new Person());
案例:
需求:將小汽車改裝成3個(gè)輪子的黑車屯烦。
1:汽車類坷随。
2:汽車修理廠
/*
匿名對(duì)象
匿名信
修黑車
汽車類
黑車廠類
把汽車的改成黑色3輪車房铭。
*/?
//汽車類
class Car {?
String name = "smart";? //名字
String color = "red";? //顏色
int num = 4;? //輪胎數(shù)量
void run() {?
System.out.println(name + ":" + color + ":" + num + ":跑起來(lái)了。温眉。缸匪。。");?
}?
}?
//改車工廠
class BlackCarFactory {?
String name;? //工廠名字
String addr;? //工廠地址
Car repairCar(Car c) {? //將車改成黑色类溢,3輪
c.num = 3;?
c.color = "黑色";?
System.out.println("改裝成功啦凌蔬。。闯冷。");
return c;?
}?
}?
//主函數(shù)
class Demo1 {?
public static void main(String[] args) {?
BlackCarFactory bcf = new BlackCarFactory();? //產(chǎn)生一個(gè)改車工廠對(duì)象
bcf.name = "幸福修理廠";?
bcf.addr = "天河區(qū)棠東東路御富科貿(mào)園a棟206";?
// 非匿名對(duì)象?
Car c = new Car();? //產(chǎn)生一汽車對(duì)象
c.run();? //運(yùn)行起來(lái)
// 跑到改車工廠砂心,將車傳入,進(jìn)行改裝?
bcf.repairCar(c);?
// 改裝完成蛇耀,取車辩诞,在運(yùn)行?
c.run();?
// 匿名對(duì)象一,只使用一次:?
// 如下創(chuàng)建了2個(gè)對(duì)象?
/*
* new Car().run();
*?
* new Car().run();
*/?
// 匿名對(duì)象二,作為實(shí)際參數(shù)傳遞?
Car c2 = bcf.repairCar(new Car()); //直接將車送進(jìn)改裝工廠
c2.run();? //改裝完后運(yùn)行
System.out.println();?
}?
}?
總結(jié):
1. 匿名對(duì)象設(shè)置的屬性永遠(yuǎn)無(wú)法獲鹊僦稀躁倒?? 沒(méi)有引用變量指向那個(gè)對(duì)象。
2. 任何兩個(gè)匿名對(duì)象使用==比較洒琢,永遠(yuǎn)返回false秧秉。
3.? 匿名對(duì)象主要應(yīng)用于實(shí)參。