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