一、抽象類與接口
抽象類
特點:?
1.抽象類中可以構(gòu)造方法?
2.抽象類中可以存在普通屬性,方法,靜態(tài)屬性和方法。?
3.抽象類中可以存在抽象方法。?
4.如果一個類中有一個抽象方法,那么當(dāng)前類一定是抽象類;抽象類中不一定有抽象方法。
5.抽象類中的抽象方法,需要有子類實現(xiàn),如果子類不實現(xiàn),則子類也需要定義為抽象的。
6,抽象類不能被實例化,抽象類和抽象方法必須被abstract修飾
關(guān)鍵字使用注意:
抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native訪問修飾符修飾。
接口
1.在接口中只有方法的聲明,沒有方法體。
2.在接口中只有常量,因為定義的變量,在編譯的時候都會默認(rèn)加上public static final
3.在接口中的方法,永遠(yuǎn)都被public來修飾。
4.接口中沒有構(gòu)造方法,也不能實例化接口的對象。(所以接口不能繼承類)
5.接口可以實現(xiàn)多繼承
6.接口中定義的方法都需要有實現(xiàn)類來實現(xiàn),如果實現(xiàn)類不能實現(xiàn)接口中的所有方法則實現(xiàn)類定義為抽象類。
7,接口可以繼承接口,用extends。
二、 java里的靜態(tài)變量是放在了堆內(nèi)存還是棧內(nèi)存?
堆區(qū):?
1.存儲的全部是對象,每個對象都包含一個與之對應(yīng)的class的信息。(class的目的是得到操作指令)?
2.jvm只有一個堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身?
棧區(qū):?
1.每個線程包含一個棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對象和自定義對象的引用(不是對象),對象都存放在堆區(qū)中?
2.每個棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。?
3.棧分為3個部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。?
方法區(qū):?
1.又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。
2.方法區(qū)中包含的都是在整個程序中永遠(yuǎn)唯一的元素,如class,static變量。
3.運行時常量池
常量池:
1.常量池中包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數(shù)組)的常量值。
1.1 這些類是Byte,Short,Integer,Long,Character,Boolean,另外兩種浮點數(shù)類型的包裝類則沒有實現(xiàn)。另 外Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應(yīng)值小于等于127時才可使用對象池,也即對象不負(fù) 責(zé)創(chuàng)建和管理大于127的這些類的對象。大于127的對象存放在堆中。
1.2 String類也實現(xiàn)了常量池技術(shù)
2.常量池還包含一些以文本形式出現(xiàn)的符號引用,比如:
2.1 類和接口的全限定名;
2.2 字段的名稱和描述符;
2.3 方法和名稱和描述符。
三、&,| 與&&,||
1.對于&
String s = null;看下面一段代碼
if( (s!=null) & (s.length()>0) ) // String s = null;沒有給s開辟空間,s.length()報NullPointerException沒有指向的錯誤
2.對于&&
String s = null;
if( (s!=null) && (s.length()>0) )//&&和|| 是按照“短路”方式求值的。如果第一個操作數(shù)已經(jīng)能夠確定表達(dá)式的值,第二個操作數(shù)就不必計算了
????? 位移運算符:&和| 運算符應(yīng)用于布爾值,得到的結(jié)果也是布爾值,不按“短路”方式計算。即在得到計算結(jié)果之前,一定要計算兩個操作數(shù)的值。
四、內(nèi)部類
1. 靜態(tài)內(nèi)部類:
? ? 1). 靜態(tài)內(nèi)部類本身可以訪問外部的靜態(tài)資源,包括靜態(tài)私有資源。但是不能訪問非靜態(tài)資源,可以不依賴外部類實例而實例化。
2. 成員內(nèi)部類:
? ? 1). 成員內(nèi)部類本身可以訪問外部的所有資源,但是自身不能定義靜態(tài)資源,因為其實例化本身就還依賴著外部類。
3. 局部內(nèi)部類:
? ? 1). 局部內(nèi)部類就像一個局部方法,不能被訪問修飾符修飾,也不能被static修飾。
? ? 2). 局部內(nèi)部類只能訪問所在代碼塊或者方法中被定義為final的局部變量。
4. 匿名內(nèi)部類:
? ? 1). 沒有類名的內(nèi)部類,不能使用class,extends和implements,沒有構(gòu)造方法。
? ? 2). 多用于GUI中的事件處理。
? ? 3). 不能定義靜態(tài)資源
? ? 4). 只能創(chuàng)建一個匿名內(nèi)部類實例。
? ? 5). 一個匿名內(nèi)部類一定是在new后面的,這個匿名類必須繼承一個父類或者實現(xiàn)一個接口。
? ? 6). 匿名內(nèi)部類是局部內(nèi)部類的特殊形式,所以局部內(nèi)部類的所有限制對匿名內(nèi)部類也有效
五、final
final 修飾符
final 變量:
final 變量能被顯式地初始化并且只能初始化一次。被聲明為 final 的對象的引用不能指向不同的對象。但是 final 對象里的數(shù)據(jù)可以被改變。也就是說 final 對象的引用不能改變,但是里面的值可以改變。
final 修飾符通常和 static 修飾符一起使用來創(chuàng)建類常量。
final 方法:
類中的 final 方法可以被子類繼承,但是不能被子類修改。
聲明 final 方法的主要目的是防止該方法的內(nèi)容被修改。
如下所示,使用 final 修飾符聲明方法。
final 類:
final 類不能被繼承,沒有類能夠繼承 final 類的任何特性。
值傳遞引用傳遞:https://www.zhihu.com/question/31203609?sort=created
六、變量初始化
1. 類的初始化順序:父類靜態(tài)變量 --> 父類靜態(tài)代碼塊 --> 子類靜態(tài)變量 --> 子類靜態(tài)代碼塊 -->? ? ? 父類非靜態(tài)變量 --> 父類非靜態(tài)代碼塊 --> 父類構(gòu)造方法 --> 子類非靜態(tài)變量 --> 子類非靜態(tài)代碼塊 --> 子類構(gòu)造方法。
2. 全局變量不初始化有默認(rèn)值,局部變量必須初始化后才能使用,否則編譯錯誤。