標籤:eclips 錯誤 tar href throwable odex 檢查 表示 預設
1.public static void main() 方法中,static 和 public可以換位置,可以final修飾,也可以synchronize修飾。
final修飾變數時,如果沒有static修飾,那麼可以在聲明時賦值,也可以在建構函式中賦值。。
2.類中的靜態代碼塊比main方法先執行,無論靜態代碼塊在main之前還是之後。準確來說,這是因為,靜態代碼塊在類載入時就會執行,並且只執行一次。而main方法是類載入入口,遇到main就會載入類(new也會),這時候會先載入靜態代碼塊(無論在main前還是後面),然後再去執行main方法中的內容。而非靜態代碼塊就要每次new對象時都會執行。靜態代碼塊只載入一次,如果main時已經執行了,那麼new時就不會再執行了。
3.初始化的順序:父類優先於子類,先把父類初始化完了再初始化子類;但是注意靜態代碼塊特殊,因為靜態代碼塊是在類載入階段,優先於其他部分,所以會先載入父類和子類靜態代碼塊,再載入父類和子類的其他部分。
(1) 父類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)(2) 子類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )(3) 父類非靜態代碼塊( 包括非靜態初始化塊,非靜態屬性 )(4) 父類建構函式(5) 子類非靜態代碼塊 ( 包括非靜態初始化塊,非靜態屬性 )(6) 子類建構函式4.範圍
5.final關鍵字
final修飾類:該類不可以被繼承,裡面屬性預設都是final。如String
final修飾方法:方法不可以被覆蓋。
final修飾變數:變數不可以被修改。
final修飾參考型別如數組,則引用(地址)不可以被修改,但是引用的內容可以被修改,數組中的值可以改變。
6.String類
String類是被final,表示不可以被繼承,也不暴露。該類中使用final char[]數組來存字串。該數組也是final修飾,private修飾的,,所以引用(地址不可變),但是數組中內容可以變,設計人員每次運算元組時,不會去原數組進行操作,而是建立一個數組等於原數組,進行操作,並返回新數組。
因為底層是數組,所以對於一個字串s="s",數組長度是固定的,s+"a",此時會用新數組操作,返回一個新字串,並不是在原來的數組中操作,所以這裡有兩個對象,"s"是不變的所以String是不可變的
7.三大特性
2)繼承:繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充新的能力。繼承避免了對一般類和特殊類之間共同特徵進行的重複描述。
3)封裝:封裝就是把同一類事物的共性(包括屬性和方法)歸到同一類中,方便使用。類可以對自身的方法和屬性進行保護,只讓可信的類操作,對不可信資訊的進行隱藏
4)多態性:多態性是指同一操作作用在不同對象時,會產生不同語義,產生不同結果。多態通過重載(編譯時間多態)和覆蓋(運行時多態)實現。父類引用只能調用父類中存在的方法和屬性,不能調用子類的擴充部分;因為父類引用指向的是堆中子類對象繼承的父類;
重載通過不同參數來實現,不能通過返回參數、方法許可權以及拋出異常的不同來實現。
8.float f = 3.4編譯不會通過,應該f=3.4f.9.&是按位與運算,&&是邏輯與10、heap 和stack 有什麼區別?
答:棧是一種線形集合,其添加和刪除元素的操作應在同一段完成,棧按照後進先出的方式進行處理;堆是棧的一個組成元素。
11.抽象類別和介面
首先,都不可以被執行個體化。
下面比較一下兩者的文法區別:
1.抽象類別可以有構造方法,介面中不能有構造方法。
2.抽象類別中可以有普通成員變數,也可以有靜態成員變數,但是介面中沒有普通成員變數 ,都是 public static final靜態成員變數。
3.抽象類別中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類別中的抽象方法的訪問類型可以是public,protected和(預設類型,雖然
eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public類型的,並且預設即為public abstract類型。
5. 抽象類別中可以包含靜態方法(非抽象方法可以是靜態),介面中不能包含靜態方法
7. 一個類可以實現多個介面,但只能繼承一個抽象類別。 java 中會存在記憶體流失嗎,請簡單描述。【基礎】
答:會;存在無用但可達的對象,這些對象不能被GC 回收,導致耗費記憶體資源。
無法分配記憶體(記憶體不夠),就是記憶體溢出
error 和exception 有什麼區別? 【基礎】都繼承Throwable
答:error 表示系統級的錯誤和程式不必處理的異常,是恢複不是不可能但很困難的情況下的一種嚴重問題;比如記憶體溢出,不可能指望程式能處理這樣的情況;exception 表示需要捕捉或者需要程式進行處理的異常,是一種設計或實現問題;也就是說,它表示如果程式運行正常,從不會發生的情況。
運行時異常表示讓程式無法恢複的異常,編譯器不檢查這些異常,不需要捕捉,可以選擇拋出,不用聲明;
受檢查異常表示程式可以處理的異常,需要捕捉,或者拋出並聲明。
常見的運行時異常:
null 指標異常類:NullPointerException
類型強制轉換異常:ClassCastException
數組負下標異常:NegativeArrayException
數組下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
檔案已結束異常:EOFException
檔案未找到異常:FileNotFoundException
字串轉換為數字異常:NumberFormatException
操作資料庫異常:SQLException
輸入輸出異常:IOException
方法未找到異常:NoSuchMethodException
try-finally
在try-finally中,當try中返回一個變數,如return a.但是finally中對a做了修改(finally中沒有return a),此時try中還是返回沒有修改的a,因為return之前會將return的內容儲存在臨時棧中,再去執行finally內容,執行完finally內容再return。不過當finally中有return語句,就會覆蓋原來的return
1、不管有木有出現異常,finally塊中代碼都會執行;
2、當try和catch中有return時,finally仍然會執行;
3、finally是在return後面的運算式運算後執行的(此時並沒有返回運算後的值,而是先把要返回的值儲存起來,管finally中的代碼怎麼樣,返回的值都不會改變,任然是之前儲存的值),所以函數傳回值是在finally執行前確定的,但是finally也是在return之前執行;
4、finally中最好不要包含return,否則程式會提前退出,傳回值不是try或catch中儲存的傳回值。finally中有return,會覆蓋前面的return5、catch中有System.exit(0)。表示將整個虛擬機器裡的內容都釋放,JVM停止工作,此時程式正常退出,也就不會再執行finally了 ThreadLocal
ThreadLocal為變數在每個線程中都建立了一個副本,那麼每個線程可以訪問自己內部的副本變數。
ThreadLocal存放的值是線程封閉,線程間互斥的,主要用於線程內共用一些資料,避免通過參數來傳遞
線程的角度看,每個線程都保持一個對其線程局部變數副本的隱式引用,只要線程是活動的並且 ThreadLocal 執行個體是可訪問的;線上程消失之後,其線程局部執行個體的所有副本都會被記憶體回收
在Thread類中有一個Map,用於儲存每一個線程的變數的副本。
對於多線程資源共用的問題,同步機制採用了“以時間換空間”的方式,而ThreadLocal採用了“以空間換時間”的方式
Arrays.sort和Collections.sort使用的排序
Arrays.sort總結: lenthth<47 插入排序
47<length<286 雙軸快速排序 (兩個樞紐,將數組分成三部分,對著三部分遞迴)。
length>286 且連續性(升序或者降序)不好 雙軸快速排序
length>286 且連續性好 歸併排序
Collections.sort調用了Arrays.sort。
非抽象類別實現介面兩同兩小一大原則:方法名相同,參數類型相同
子類傳回型別小於等於父類方法傳回型別,
子類拋出異常小於等於父類方法拋出異常,
子類存取權限大於等於父類方法存取權限。
複製函數
從一個對象複製一個對象,則對複製對象的修改不會影響到原對象。
使用clone()的步驟:
1.實現Cloneable介面;這是一個標識介面,沒有任何方法
2.重寫Object中的clone()方法;
3.調用super.clone完成淺拷貝。自己操作,完成深拷貝
淺拷貝:只考慮基本成員變數,不會複製對象中引用的其他對象(包括數組),
深拷貝:把引用的其他對象也重新拷貝一份。
反射
主要作用就是在運行時動態建立類對象。
建立class類:class.forName() 類名.class 執行個體.getClass()
建立對象的方式
new 反射 clone 還原序列化
java基礎知識