1昭伸、Java類的成員變量:
Java類中的成員變量可以是任何一種數(shù)據(jù)類型(包括基本數(shù)據(jù)類型和引用數(shù)據(jù)類型)适秩;
在定義成員變量時(shí)可以對(duì)其進(jìn)行初始化巍佑,如果不進(jìn)行初始化斋配,Java會(huì)使用默認(rèn)值對(duì)其進(jìn)行初始化孔飒,如下圖灌闺。
成員變量的作用范圍是整個(gè)類體。
2坏瞄、Java類的構(gòu)造方法
在對(duì)象的創(chuàng)建時(shí)桂对,相當(dāng)于使用了new + 構(gòu)造方法來(lái)創(chuàng)建對(duì)象;
構(gòu)造方法與類同名且沒(méi)有返回值鸠匀,如果自己不定義構(gòu)造方法蕉斜,則系統(tǒng)默認(rèn)為其類提供一個(gè)形如類名 () { }的構(gòu)造方法(將所有基本數(shù)據(jù)類型初始化為0,引用類型定義為null)狮崩,如果我們定義了構(gòu)造方法蛛勉,系統(tǒng)則不會(huì)再為我們提供默認(rèn)的構(gòu)造方法鹿寻。
Java中構(gòu)造方法在調(diào)用時(shí)睦柴,構(gòu)造方法中的形參會(huì)在棧內(nèi)存中分配空間,當(dāng)構(gòu)造方法調(diào)用結(jié)束后毡熏,改椞沟校空間就會(huì)被清理。如下圖代碼:
在該方法中的main函數(shù)中痢法,當(dāng)生成一個(gè)tom對(duì)象時(shí)狱窘,內(nèi)存中的變化情況入下:
其中在棧內(nèi)存中,存放了tom對(duì)象的引用财搁,以及在構(gòu)造函數(shù)執(zhí)行過(guò)程中生成的椪赫ǎ空間,存放著兩個(gè)形參的內(nèi)存尖奔,在堆內(nèi)存中則存放了該對(duì)象的成員變量的信息搭儒,當(dāng)構(gòu)造函數(shù)執(zhí)行結(jié)束后,椞嶙拢空間中的_id與_age的就會(huì)被釋放掉淹禾。
看下面代碼中內(nèi)存的情況:
手畫了一下大概的內(nèi)存情況:
最后main方法執(zhí)行完成后,堆內(nèi)存中的start與end也被釋放了茴扁,然后Java的垃圾回收機(jī)制則會(huì)去清理堆內(nèi)存里的數(shù)據(jù)铃岔。
3、類:具有同一類事物的一個(gè)抽象峭火。 對(duì)象:一個(gè)類的一個(gè)特殊的實(shí)例毁习。
類與對(duì)象之間的關(guān)系:關(guān)聯(lián)、繼承卖丸、聚合(聚集纺且、組合)、多態(tài)和實(shí)現(xiàn)坯苹。
4隆檀、面向?qū)ο蟮脑O(shè)計(jì)思想:繼承、封裝、多態(tài)和抽象恐仑。
5泉坐、Java中用關(guān)鍵字class定義一個(gè)類;用new來(lái)創(chuàng)建一個(gè)對(duì)象裳仆;引用(對(duì)象的引用腕让,棧中的一小塊兒內(nèi)存指向堆空間的一大塊兒內(nèi)存。歧斟。纯丸。);new一般與構(gòu)造函數(shù)一起使用(和類重名静袖,沒(méi)有返回值)觉鼻。
6、方法重載(overload):在同一個(gè)類中队橙,方法的名字一樣坠陈,方法的參數(shù)類型或者參數(shù)個(gè)數(shù)可以不同。(構(gòu)造函數(shù)的重載)捐康。
在調(diào)用時(shí)仇矾,會(huì)根據(jù)不同的參數(shù)表選擇對(duì)應(yīng)的方法。(C++的靜態(tài)多態(tài)解总。贮匕。。)
7花枫、this關(guān)鍵字:this指的是當(dāng)前對(duì)象刻盐,在堆內(nèi)存中,存在一個(gè)自己的引用指向自身乌昔。(最常見是可以用于構(gòu)造函數(shù)隙疚,當(dāng)構(gòu)造函數(shù)中的傳參與類的屬性一樣時(shí)就可以使用如this.name = name這種寫法以區(qū)分。)this也可以看作是一個(gè)變量磕道,它的值是當(dāng)前對(duì)象的引用供屉。
8、static關(guān)鍵字:在類中溺蕉,用static聲明的成員變量為靜態(tài)成員變量伶丐,其為該類的公用變量,在第一次使用時(shí)被初始化疯特,對(duì)于該類的所有對(duì)象來(lái)說(shuō)哗魂,static成員變量只有一份,分配在數(shù)據(jù)區(qū)漓雅。
用static聲明的方法為靜態(tài)方法录别,在調(diào)用該方法時(shí)朽色,不會(huì)將對(duì)象的引用傳遞給它,所以static方法中不能訪問(wèn)非static的成員變量组题。(靜態(tài)方法不再是針對(duì)某個(gè)對(duì)象的調(diào)用葫男,所以不能訪問(wèn)非靜態(tài)成員。)
可以通過(guò)對(duì)象引用或者類名(不需要實(shí)例化)訪問(wèn)靜態(tài)成員崔列。
9梢褐、package和import語(yǔ)句
為了解決眾多類的命名沖突的問(wèn)題,Java引入package機(jī)制赵讯,提供類的多重命名空間盈咳。(包起名的方法:一般把公司的域名反過(guò)來(lái),這個(gè)類的class文件一定要位于正確的目錄下边翼,跟package的命名結(jié)構(gòu)一樣鱼响。)
使用時(shí),用import關(guān)鍵字引用讯私,引入單個(gè)類也可以热押,使用.*引入所有的類西傀。Java中可以不使用import語(yǔ)句就可以直接使用java.lang包中的類斤寇,比如最常見的System和String類。
在使用時(shí)一定要注意環(huán)境變量的classpath路徑拥褂,必須class文件的最上層包的父目錄位于classpath下娘锁。也可以將其打到一個(gè)jar包里,將jar包的路徑放到環(huán)境變量中(命令:jar -cvf xx.jar *.*)
10饺鹃、訪問(wèn)控制權(quán):private (default:什么都不寫) protected public
11莫秆、extends關(guān)鍵字:一個(gè)類從另外一個(gè)類繼承,繼承中子類繼承了父類的所有的成員變量以及所有的方法悔详,包括private變量镊屎,但是private成員變量不能用。
12茄螃、super關(guān)鍵字:使用super關(guān)鍵字引用基類的成分缝驳。
13、繼承中的構(gòu)造方法:
子類的構(gòu)造過(guò)程必須調(diào)用基類中的構(gòu)造方法归苍;
子類可以在自己的構(gòu)造方法中使用super(參數(shù)列表)調(diào)用基類的構(gòu)造方法(如果調(diào)用super用狱,必須寫在子類構(gòu)造方法的第一行,即先構(gòu)造父類然后構(gòu)造子類拼弃;可以使用this(參數(shù)列表)調(diào)用本類中另外的構(gòu)造方法夏伊。);
如果子類的構(gòu)造方法中沒(méi)有顯式地調(diào)用基類的構(gòu)造方法吻氧,則系統(tǒng)會(huì)默認(rèn)調(diào)用基類無(wú)參的構(gòu)造方法溺忧,如果基類沒(méi)有無(wú)參構(gòu)造方法咏连,則編譯會(huì)報(bào)錯(cuò)。
14鲁森、方法重寫(overwrite/override):
在子類中可以根據(jù)需要對(duì)基類中繼承的方法進(jìn)行重寫捻勉;
重寫方法必須和被重寫方法具有相同的方法名稱、參數(shù)列表和返回值類型(防止出錯(cuò)刀森,在基類中復(fù)制踱启。。研底。)埠偿;
重寫方法不能使用比被重寫方法更嚴(yán)格的訪問(wèn)權(quán)限。
15榜晦、final關(guān)鍵字:
final的變量值不能夠被改變冠蒋,類似C++的const(final成員變量,final局部變量乾胶,傳參)抖剿;
final的方法不能被重寫;
final的類不能被繼承识窿。
16斩郎、Java所有的老祖宗類,Object
Object類是所有Java類的根基類喻频,如果在類的聲明中未使用extends關(guān)鍵字指明其基類缩宜,則默認(rèn)基類為Object類;
toString方法:Object類中定義有public String toString()方法甥温,其返回值是String類型锻煌,描述當(dāng)前對(duì)象的有關(guān)信息,返回值是:類名+@+哈希code姻蚓;用戶可以根據(jù)需要在自定義類型中重寫toString()方法宋梧。
equals()方法:Object類中定義了public boolean equals(Object obj)方法,提供對(duì)象是否相等的邏輯比較狰挡;x.equals(y)當(dāng)x和y是同一個(gè)對(duì)象的引用時(shí)返回true捂龄,否則返回false;JDK中重寫了String和Date類中的equals方法圆兵,調(diào)用這些對(duì)象的equals方法時(shí)跺讯,當(dāng)兩個(gè)對(duì)象的是同一個(gè)類且對(duì)象的屬性內(nèi)容相等時(shí)(不要求是同一個(gè)對(duì)象),返回true殉农,否則返回false刀脏;用戶也可以根據(jù)需要重寫自定義類型中的equals()方法。
17超凳、upcasting:父類的引用指向子類對(duì)象愈污,接口的引用指向?qū)崿F(xiàn)了接口類的對(duì)象(C++中父類的指針指向子類) 反之downcasting
18耀态、多態(tài):實(shí)現(xiàn)多態(tài)的三要素 繼承、重寫和父類引用指向子類對(duì)象暂雹。
動(dòng)態(tài)綁定是指:在程序執(zhí)行期間首装,判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法(雖然傳入的是一個(gè)父類的名稱杭跪,但是引用所指向的是一個(gè)子類對(duì)象仙逻,所以在程序運(yùn)行時(shí)會(huì)調(diào)用子類重寫父類的方法而不是父類的方法)。
19涧尿、抽象類:
用abstract關(guān)鍵字來(lái)修飾一個(gè)類時(shí)系奉,這個(gè)類叫抽象類;用abstract來(lái)修飾一個(gè)方法時(shí)姑廉,該方法叫抽象方法缺亮;
含有抽象方法的類必須被聲明為抽象類,抽象類必須被繼承桥言,抽象方法必須被重寫萌踱;
抽象類不能被實(shí)例化,抽象方法只需聲明而不需實(shí)現(xiàn)(在子類中重寫實(shí)現(xiàn))号阿。(C++中純虛函數(shù))
20并鸵、接口interface:
接口是抽象方法和常量值定義的集合;從本質(zhì)上講倦西,接口是一種特殊的抽象類能真,這種抽象類中只包含常量和方法的定義而沒(méi)有變量和方法的實(shí)現(xiàn)(所以的方法都是抽象方法,并且都是public的扰柠,所有的成員變量都是public的static的以及final的);接口與接口之間可以相互繼承疼约,類和接口之間通過(guò)實(shí)現(xiàn)(implements)卤档。
接口的本質(zhì),在內(nèi)存中可以看到這個(gè)類的部分方法程剥,也就是調(diào)用接口本身定義的抽象方法劝枣。