java比较equlse_java基础知识要点
一、抽象:
二、封裝:有了封裝才有數(shù)據(jù)類型!個(gè)體更多的設(shè)置為封裝體,這樣更加安全。該公開的公開(方法),該隱藏的隱藏(屬性),配置一個(gè)訪問窗口
方法的調(diào)用(按值傳遞和按引用傳遞)
1、在棧中分配空間(暫時(shí)給方法分配棧空間,執(zhí)行完畢后就消失,注重內(nèi)存的畫圖分析)
內(nèi)存分為代碼空間(方法的代碼)和數(shù)據(jù)空間,方法在數(shù)據(jù)空間還保存有方法的地址
2、傳參
3、執(zhí)行
三、繼承:確定父類和子類is-a(關(guān)系)
在子類中自己定義一個(gè)構(gòu)造方法時(shí),當(dāng)父類的屬性時(shí)private時(shí),我們就不能直接定義自己構(gòu)造方法的屬性(?怎么做:);第一種方法是通過調(diào)用父類的public的方法來定義屬性;第二種方法是:所有的父類構(gòu)造方法是public的,所以我們可以通過super(參數(shù))這個(gè)表達(dá)式類調(diào)用父類的構(gòu)筑方法!!
任何子類的構(gòu)造方法都會(huì)去調(diào)用f父類的構(gòu)造方法!(就算自己不寫也會(huì)調(diào)用!而當(dāng)程序員沒有寫構(gòu)造方法是,系統(tǒng)就會(huì)自動(dòng)定義一個(gè)無參的構(gòu)造方法public Birld(){super();}所以在里面就隱含的調(diào)用了父類的無參的構(gòu)造方法,如果父類中書寫了自己的構(gòu)造函數(shù)而忽略了無參構(gòu)造函數(shù),這是子類就不能自動(dòng)調(diào)用無參構(gòu)造函數(shù),就會(huì)報(bào)錯(cuò)!!),字super引用的是什么取決于是用它的類,我們可以訪問父類成員,即使它們不是用于繼承的,但是與this不一樣的是,this引用的是一個(gè)類的某個(gè)特定實(shí)例,super是對(duì)父類成員的一個(gè)一般引用!
任何子類的構(gòu)造方法的第一行必須是this(、、)/*這樣同樣能調(diào)用父類的構(gòu)造方法!!而且父子類不會(huì)是所有的構(gòu)造方法都是this(、、、)*/;或者super(、、);的調(diào)用,如果程序員不寫這些表達(dá)式,則系統(tǒng)會(huì)隱含的調(diào)用super(、、、),當(dāng)子類覆蓋了父類的方法,如果要訪問父類的方法(在子類中訪問)就必須加spuer,但如果在第三方類中訪問是不能實(shí)現(xiàn)的!!!!!
例子:
int i=0;
Leaf(int i){this.i=i;}就近原則!!
為什么所有的子類都要調(diào)用父類的構(gòu)造方法?構(gòu)造方法對(duì)象生成,因?yàn)樵谏勺宇惖臅r(shí)候就必須要構(gòu)造方法
預(yù)定義引用:一個(gè)對(duì)象在創(chuàng)建時(shí),系統(tǒng)會(huì)自動(dòng)的生成一個(gè)對(duì)象自身的引用this,當(dāng)內(nèi)部類要訪問外部類成員時(shí),而恰好這個(gè)成員與內(nèi)部類的成員同名時(shí),就可以用this對(duì)這兩個(gè)成員進(jìn)行識(shí)別。格式:Outter.this.成員名
在子類中可以自己定義自己的獨(dú)特的屬性!如果子類的屬性和父類的屬性同名了(現(xiàn)實(shí)中小量存在,但是我們應(yīng)該避免這樣的情況的發(fā)生),但是方法的同名卻是很常見的!當(dāng)同名的方法時(shí),只要是不同的參數(shù),就不會(huì)產(chǎn)生混淆;當(dāng)同名同參的時(shí)候,這是調(diào)用子類的方法!
方法的覆蓋(方法的重寫?)1、發(fā)生在父類與子類之間。2、子類的方法與父類的方法同名又同參而且返回值是相同的!!3、子類的訪問的控制不能比父類更封閉。4、子類拋出異常類型不能比父類更寬泛。子類和父類有相同的行為,但是方式是不一樣的,例如動(dòng)物是移動(dòng)的,鳥是飛著的,魚是游著的。
父類的非抽象方法可重寫為抽象方法!!
方法的重載:方法名一樣,參數(shù)列表不一樣,(參數(shù)的個(gè)數(shù)、類型、順序至少有一個(gè)不相同),但是返回的類型和方法的類型可以不一樣
可以使用final修飾符來定義一個(gè)方法,子類就不能重寫final方法,這種用法確保某個(gè)派生類對(duì)某個(gè)方法是用的是某個(gè)特定定義!
一個(gè)類可以是一個(gè)或者多個(gè)其他類的父類,這就產(chǎn)生了類的層次結(jié)構(gòu)!
所有java類都是直接或者間接派生自object類,通常我們會(huì)重寫object類的例如:toString(),equals()方法來滿足自己的需要
Instanceof :判斷一個(gè)方法是不是一個(gè)類的實(shí)例!!
If(對(duì)象名instanceof類型名)
四、多態(tài)
意義1、如System.out.println();方法的重載簡(jiǎn)化了方法,這是多態(tài)的體現(xiàn)!
2、對(duì)象的多態(tài),一種對(duì)象多種形態(tài)!決定于繼承關(guān)系!這是最重要的多態(tài)!
A—B(A完全包含了B的范圍時(shí))。可以進(jìn)行對(duì)象的多態(tài)A a=new B(” ”);
特征1、子類對(duì)象當(dāng)作父類對(duì)象來體現(xiàn)時(shí),就只能訪問父類的已經(jīng)定義的方法,不能訪問子類自己獨(dú)特的方法!!
2、如果子類覆蓋了父類的方法,再把子類對(duì)象當(dāng)作父類的對(duì)象來體現(xiàn)時(shí),再去調(diào)用該方法時(shí),調(diào)用的是子類覆蓋后的方法!!對(duì)象的行為不會(huì)因?yàn)槟惝?dāng)作什么就會(huì)改變!Animal a=new Bird();
主觀認(rèn)為客觀存在
編譯時(shí)的類型運(yùn)行時(shí)的類型
3、如果父類對(duì)象當(dāng)作子類的對(duì)象來體現(xiàn)時(shí),需要強(qiáng)制轉(zhuǎn)換(在前面添加子類的名),但是也不是全部可以轉(zhuǎn)換!!如:
Animal a=newFish();
Birdb=(Bird)a;//這樣的強(qiáng)制轉(zhuǎn)換是絕對(duì)不允許的,除非a是bird類型
注意編譯器不會(huì)報(bào)錯(cuò)!但是在虛擬機(jī)上運(yùn)行是會(huì)報(bào)錯(cuò)
常見異常:ClassCastException強(qiáng)制轉(zhuǎn)換異常
NullPointException空指針異常
ArrayIndexOut Exception數(shù)組下標(biāo)越界異常
4、靜態(tài)方法和成員變量的綁定是靜態(tài)綁定,實(shí)例方法的綁定是動(dòng)態(tài)綁定!!!
Static:靜態(tài)屬性是描述類的特征,非靜態(tài)屬性描述各個(gè)對(duì)象的特征
靜態(tài)和非靜態(tài)的差別1:空間分配的時(shí)間不一樣,靜態(tài)屬性是在類加載的時(shí)候分配的,實(shí)例屬性(非靜態(tài)屬性)是在生成對(duì)象的時(shí)候分配的
2:空間分配的方式也不一樣,靜態(tài)屬性只分配一個(gè)空間;實(shí)例屬性則是有多少的對(duì)象就分配多少的空間哦!!
3:訪問方式不一樣,靜態(tài)屬性的訪問是:類名.靜態(tài)屬性(與任何對(duì)象都沒有關(guān)系);而實(shí)例則是:對(duì)象.靜態(tài)屬性。
對(duì)于方法同樣可以分為靜態(tài)的方法(行為與某個(gè)對(duì)象無關(guān))和非靜態(tài)的方法(行為一定與某個(gè)對(duì)象有關(guān))。訪問時(shí),靜態(tài)方法的訪問是:類名.對(duì)象方法(或者)對(duì)象.靜態(tài)方法(不規(guī)范,存在奇異,最好別用)。
注意:在靜態(tài)方法中,不能訪問本類中非靜態(tài)的成員
Java Test1.啟動(dòng)JVM2.找到Test.class3.加載Test.class4 .Test.main();
靜態(tài)代碼塊:類的加載和靜態(tài)代碼塊執(zhí)行順序
靜態(tài)方法沒有多態(tài),是不能夠被覆蓋的。與左邊的對(duì)象沒有關(guān)系,a.m1();
Final:不變的最終的。可以修飾屬性、方法、類、方法中的局部變量
修飾屬性是,屬性時(shí)不可以改變的;修飾方法表示方法不能被覆蓋(但可以被重載!);修飾類時(shí)表示類不能被繼承;修飾方法中的局部變量時(shí),同樣是不可變的,相當(dāng)于常量。
final屬性賦值有兩種方法:定義的時(shí)候賦值;或者在構(gòu)造方法中進(jìn)行賦值,任選其一!!
Final方法可以被重載,但不能被重寫!!
1.static final int a=2;//靜態(tài)final只能在定義的時(shí)候賦值,描述整個(gè)類的特征
2.final int b;//非靜態(tài)final,一般是在構(gòu)造方法中賦值!描述某一個(gè)個(gè)體
例:private static final int a=10;靜態(tài)final表示一個(gè)類的
例:private final int b;表示一個(gè)對(duì)象的
Public FianlTest(int b){
This.b=b;
}
privateWeapon[ ]w;
Army(intn){
this.w=newWeapon[ n];
}
Abstract:抽象的,修飾類或者方法。
抽象類:不能實(shí)例化,但是具體類是可以實(shí)例化的。
如果一個(gè)類中包含有抽象方法,該類就必須定義成抽象類。
如果一個(gè)類不包含抽象方法,該類也可以定義成抽象類。(抽象類中可以有非抽象方法!!)
抽象類是可以實(shí)現(xiàn)接口的。
抽象類以具體類的最大差別時(shí),抽象類不能生成對(duì)象,但是可以定義引用(可以引用得到子類的對(duì)象)
抽象類一般都是需要實(shí)現(xiàn)的,實(shí)現(xiàn)就是定義一個(gè)子類,覆蓋(實(shí)現(xiàn))父類的方法!!!
抽象類中Abstract與fianl時(shí)永遠(yuǎn)不能用在一起的。
抽象方法:不知道具體怎么實(shí)現(xiàn)就定義為抽象方法。
JVM實(shí)現(xiàn)機(jī)制
執(zhí)行順序:
先父類的靜態(tài)代碼塊--子類的靜態(tài)的靜態(tài)代碼塊--所有的屬性為0---父類的非靜態(tài)代碼塊
---父類的屬性付初始值--父類的構(gòu)造函數(shù)--子類的屬性付初始值--非靜態(tài)代碼塊--子類的構(gòu)造函數(shù)
建立多態(tài)的引用有兩種方式:是用繼承和使用接口。
一個(gè)引用變量可以指向創(chuàng)建字任何與其具有繼承相關(guān)性的類的任一對(duì)象。
接口名字可以用來聲名對(duì)象引用變量,接口引用可以指向任何實(shí)現(xiàn)該接口的任何類的任何對(duì)象。如Speaker current=new Philosopher();請(qǐng)注意我們?cè)谑褂媒涌诘囊米兞繒r(shí),我們只能調(diào)用在該接口中定義的方法,即使它所指向的對(duì)象具有其可以響應(yīng)的其他方法。但是我們可以通過強(qiáng)制轉(zhuǎn)換來轉(zhuǎn)換到恰當(dāng)?shù)囊弥幸允沟盟軌虮痪幾g器接受。如:
((Philosopher special).pontificate)();
接口:
1.接口中的所有方法都是抽象方法!
2.接口中的所有屬性都是final static
3.接口也不能實(shí)例化,也可以定義接口引用(變量)
4.接口沒有構(gòu)造方法!
5.一個(gè)類只能繼承一個(gè)類,但是接口可以多繼承接口,接口是多態(tài)注入了新的活力!!
6.接口與接口之間可以多繼承
接口相當(dāng)于標(biāo)準(zhǔn)!把服務(wù)的使用者和服務(wù)的提供者分開,降低了系統(tǒng)的耦合,有效地提高了軟件的可擴(kuò)展性和可維護(hù)性!!現(xiàn)在軟件工程所追求的是高內(nèi)聚(與外界的聯(lián)系很少)和低耦合(軟件的模塊和別的模塊的關(guān)聯(lián)越少,以后某個(gè)模塊出現(xiàn)問題就能很好的修改)
java接口就是包含常量和抽象方法的集合,抽象方法就是不具有實(shí)現(xiàn)的方法。這就是說,沒有為抽象方法定義的代碼體。該方法的頭,包括其參數(shù)列表,后面僅僅是一個(gè)分號(hào)。接口不能被實(shí)例化!!接口名字可以用來聲名對(duì)象引用變量,接口引用可以指向任何實(shí)現(xiàn)該接口的任何類的任何對(duì)象。接口的缺省類型是public abstract,且他的實(shí)現(xiàn)類必須比它的缺省類型要低,比如可以是public類型!!1、聲名接口2、實(shí)現(xiàn)接口3、使用接口
在實(shí)現(xiàn)多個(gè)接口的時(shí)候注意順序,先繼承在實(shí)現(xiàn)接口eg:class Sofa extends Chair implements Lie,Health,Care
抽象方法:及時(shí)在前面加上abstract,就算前面沒有加,默認(rèn)狀態(tài)下,接口中的方法同樣具有公共可見性(因?yàn)楸仨毻ㄟ^別的類來實(shí)例化)。一個(gè)類通過為定義咋接口中的方法提供方法來實(shí)現(xiàn)進(jìn)而實(shí)現(xiàn)該接口,類在實(shí)現(xiàn)每個(gè)接口時(shí),必須通過implements來實(shí)現(xiàn),如果一個(gè)申明其來實(shí)現(xiàn)某個(gè)特定的接口,就必須為這個(gè)接口中的所有方法進(jìn)行定義。任何一個(gè)沒有沒有被定義的方法,編譯器都會(huì)報(bào)錯(cuò)!多個(gè)類可以實(shí)現(xiàn)同一接口,這就為這些方法提供了可選的方法.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,所以這個(gè)類就必須為所有列出的接口中的方法提供實(shí)現(xiàn)!!
Iterator接口:主要的方法是hasNext(返回一個(gè)boolean值),next(返回一個(gè)對(duì)象),這些方法都不帶任何的參數(shù)。Next方法并不會(huì)把該對(duì)象從底層集合中刪除,它僅僅是返回一個(gè)指向它的引用。Iterator接口有一個(gè)remove方法,它不帶參數(shù)且具有一個(gè)void返回類型,調(diào)用此方法就會(huì)從底層集合中刪除next方法最近返回的值!
接口知識(shí)點(diǎn)補(bǔ)充:
接口重要作用:1)強(qiáng)制2)解耦3)過濾
接口遵循類的類型賦值兼并原則,即實(shí)現(xiàn)類可被看做接口類型。
Class Client{
Public void printClient(Print s)/*接口為參數(shù)類型*/
s.printChar();
}
、、、、、、main{
New Client.printClient(new Server());
}
優(yōu)點(diǎn):對(duì)于客戶類中的pribtClient()方法來說,只要接口Print不變,實(shí)現(xiàn)類Server代碼怎么變化都不會(huì)影響客戶代碼,這樣服務(wù)方在對(duì)服務(wù)進(jìn)行升級(jí)時(shí)連服務(wù)類名改變了,只需在主類中稍微加以修改。
抽象類:抽象類代表類層次結(jié)構(gòu)中的一個(gè)寬泛的概念。抽象類不能被實(shí)例化,且通過含有一個(gè)或多個(gè)沒有定義的抽象方法,。從這個(gè)意義上說,抽象類和接口類似。但是,與接口不一樣的是,抽象類可以包含非抽象的方法,以及可以包含除了常量以外的數(shù)據(jù)聲名,并且任何抽象類必須包含有abstract修飾符!!聲名為abstract的類不一定要包含抽象的方法!而是任何含有抽象方法的類必須聲明為abstract。
抽象類同樣和接口一樣可以作為方法參數(shù)。
繼承的概念適用于類也適用于接口,這就是說一個(gè)接口可以由另外的一個(gè)借口繼承而來,這些關(guān)系就構(gòu)成了接口的層次結(jié)構(gòu),它與類的層次結(jié)構(gòu)類似。 當(dāng)父類接口派生出一個(gè)子接口時(shí),該子接口就集成了父類的所有的抽象方法和常量,任何實(shí)現(xiàn)子接口的類必須實(shí)現(xiàn)其所有的方法,對(duì)于接口之間的繼承不存在任何的限制,(沒有類中的保護(hù)和私有成員具有的那些限制),應(yīng)為接口所有成員都是公共的。
泛型:java中我們可以將一個(gè)類定義為泛型,這就是說我們可以定義一個(gè)類來存儲(chǔ),操作和管理這樣的對(duì)象,即對(duì)象的類型知道該類實(shí)例化后才得到指定。Class Box{//聲名以及管理T型對(duì)象的代碼}
其內(nèi)部存儲(chǔ)的是對(duì)object類的引用,然后任何類型和對(duì)象都可以存儲(chǔ)在Box里面,事實(shí)上里面可以存儲(chǔ)對(duì)個(gè)彼此無關(guān)的對(duì)象類型,在達(dá)到這種水平的代碼的靈活性的同時(shí),我們卻失去了很多的可控性!
問題一:抽象類中有構(gòu)造方法沒?有
二:抽象類能夠繼承?派生出來的都是抽象類?抽象類派生出不一定都是抽象類,且必須實(shí)現(xiàn)父類的抽象方法,抽象類里面可以包含非抽象方法來實(shí)現(xiàn)!!
三:靜態(tài)屬性什么時(shí)候被加載?
修飾符應(yīng)用匯總:
staticfinalabstractpublicprotecteddefaultprivate
頂層類:noyesyesyesnoyesno
屬性: yesyesnoyesyesyesyes
方法: yesyesyesyesyesyesyes
局部:noyesnonononono
成員式內(nèi)部類:yesyesyesyesyesyesyes
局部式內(nèi)部類:noyesyesnononono
接口:nonoyesyesnonono
Default最多只能在包中進(jìn)行訪問
Java.lang.Object十一個(gè)方法匯總:
①:clone();分為淺拷貝和深拷貝
例:Student name;
Student teacher;
int age;
0x2201name淺拷貝!!
s1 0x123420age
0x2234teacher
0x2201namezhangsan(學(xué)生)深拷貝!!
s2 0x123420age20(學(xué)生)
0x2234teacherlilaoshi(老師)
要實(shí)現(xiàn)這個(gè)方法就必須實(shí)現(xiàn)下面兩個(gè)方法:
1、這個(gè)類必須實(shí)現(xiàn)Cloneable(標(biāo)記接口)
2、覆蓋Object中的clone();
②:equlse();源代碼:public boolean equals(Object obj) {
return (this = = obj);
}
和= =作用一樣,在實(shí)際開發(fā)上沒有實(shí)際意義,而只是抽象對(duì)象的需要,我們需要做的就是在進(jìn)行覆蓋這個(gè)方法!!
equlse一般是比較對(duì)象的值是否相等,而= =一般是比較對(duì)象的引用地址相等不
③:finalize();
源代碼:protected void finalize() throws Throwable { }
④:toString();返回字符串
源代碼:public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
直接輸出對(duì)象都要自動(dòng)調(diào)用系統(tǒng)默認(rèn)的toString(),但是我們可以自己進(jìn)行覆蓋!!
總結(jié)
以上是生活随笔為你收集整理的java比较equlse_java基础知识要点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小红书怎么不让别人看我的收藏和点赞(汉典
- 下一篇: 苹果 iOS 16.4 beta 改进“