Java中靜态變量隻能在類主體中定義,不能在方法中定義。 靜态變量屬于類所有而不屬于方法。
多态==晚綁定或動态綁定 不要把函數重載了解為多态,因為多态是一種運作期行為,不是編譯器行為。
多态:父類的引用指向子類的執行個體。
比如 Parent p = new Child()
當使用多态方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;
如果有,再去調用子類的同名方法。
靜态方法特殊,靜态方法隻能繼承,不能覆寫,如果子類有和父類相同的靜态方法,隻是起到隐藏父類方法的作用。這時候,誰的引用就調用誰的方法。
//一道多态題<阿裡巴巴> 下面代碼的輸出是什麼?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
正确答案: A 你的答案: B (錯誤)
null
sub
base
1.首先,需要明白 類的加載順序。 (1) 父類靜态代碼塊(包括靜态初始化塊,靜态屬性,但不包括靜态方法) (2) 子類靜态代碼塊(包括靜态初始化塊,靜态屬性,但不包括靜态方法 ) (3) 父類非靜态代碼塊( 包括非靜态初始化塊,非靜态屬性 ) (4) 父類構造函數 (5) 子類非靜态代碼塊 ( 包括非靜态初始化塊,非靜态屬性 ) (6) 子類構造函數 其中:類中靜态塊按照聲明順序執行,并且(1)和(2)不需要調用new類執行個體的時候就執行了(意思就是在類加載到方法區的時候執行的) 2.其次,需要了解子類覆寫父類方法的問題,也就是 方法重寫實作多态問題。 Base b = new Sub(); 它為多态的一種表現形式,聲明是Base,實作是Sub類, 了解為 b 編譯時表現為Base類特性,運作時表現為Sub類特性。 當子類覆寫了父類的方法後,意思是父類的方法已經被重寫, 題中 父類初始化調用的方法為子類實作的方法,子類實作的方法中調用的baseName為子類中的私有屬性。 由1.可知,此時隻執行到步驟4.,子類非靜态代碼塊和初始化步驟還沒有到,子類中的baseName還沒有被初始化。是以此時 baseName為空。 是以為null。
類變量在不設定初始值時,會進行預設值指派,而局部方法中聲明的變量則必須進行初始化,他不會進行預設值指派。final變量定義的時候,可以先聲明,而不給初值,這種變量也稱為final空白,無論什麼情況,編譯器都確定空白final在使用之前必須被初始化
所謂構造方法, 1,使用關鍵字new執行個體化一個新對象的時候預設調用的方法; 2,構造方法所完成的主要工作是對新建立對象的資料成員賦初值。 使用構造方法時需注意以下幾點 1.構造方法名稱和其所屬的類名必須保持一緻; 2.構造方法沒有傳回值,也不可以使用void; 3.構造方法也可以像普通方法一樣被重載; 4.構造方法不能被static和final修飾; 5.構造方法不能被繼承,子類使用父類的構造方法需要使用super關鍵字
如果在循環的過程中調用集合的remove()方法,就會導緻循環出錯,例如:
for(int i=0;i<list.size();i++){
list.remove(...);
}
循環過程中list.size()的大小變化了,就導緻了錯誤。
是以,如果你想在循環語句中删除集合中的某個元素,就要用疊代器iterator的remove()方法,因為它的remove()方法不僅會删除元素,還會維護一個标志,用來記錄目前是不是可删除狀态,例如,你不能連續兩次調用它的remove()方法,調用之前至少有一次next()方法的調用。
下列哪個選項是Java調試器?如果編譯器傳回程式代碼的錯誤,可以用它對程式進行調試。
正确答案: C 你的答案: B
java.exe
javadoc.exe
jdb.exe
javaprof.exe
java,exe是java虛拟機 javadoc.exe用來制作java文檔 jdb.exe是java的調試器 javaprof,exe是剖析工具
關于ThreadLocal 類 以下說法正确的是
正确答案: D E 你的答案: A D E
ThreadLocal繼承自Thread
ThreadLocal實作了Runnable接口
ThreadLocal重要作用在于多線程間的資料共享
ThreadLocal是采用哈希表的方式來為每個線程都提供一個變量的副本
ThreadLocal保證各個線程間資料安全,每個線程的資料不會被另外線程通路和破壞
1、ThreadLocal的類聲明: public class ThreadLocal<T> 可以看出ThreadLocal并沒有繼承自Thread,也沒有實作Runnable接口。是以AB都不對。 2、ThreadLocal類為每一個線程都維護了自己獨有的變量拷貝。每個線程都擁有了自己獨立的一個變量。 是以ThreadLocal重要作用并不在于多線程間的資料共享,而是資料的獨立,C選項錯。 由于每個線程在通路該變量時,讀取和修改的,都是自己獨有的那一份變量拷貝,不會被其他線程通路, 變量被徹底封閉在每個通路的線程中。是以E對。 3、ThreadLocal中定義了一個哈希表用于為每個線程都提供一個變量的副本: static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal> { Object value;
Entry(ThreadLocal k, Object v) { super(k); value = v; } }
private Entry[] table; } 是以D對。
Synchronized用于線程間的資料共享,而ThreadLocal則用于線程間的資料隔離。
兩個最基本的java回收算法:複制算法和标記清理算法 複制算法:兩個區域A和B,初始對象在A,繼續存活的對象被轉移到B。此為新生代最常用的算法
标記清理:一塊區域,标記可達對象(可達性分析),然後回收不可達對象,會出現碎片,那麼引出 标記-整理算法:多了碎片整理,整理出更大的記憶體放更大的對象
兩個概念:新生代和年老代 新生代:初始對象,生命周期短的
永久代:長時間存在的對象
整個java的垃圾回收是新生代和年老代的協作,這種叫做分代回收。 P.S: Serial New收集器是針對新生代的收集器,采用的是複制算法 Parallel New(并行)收集器,新生代采用複制算法,老年代采用标記整理 Parallel Scavenge(并行)收集器,針對新生代,采用複制收集算法 Serial Old(串行)收集器,新生代采用複制,老年代采用标記整理
Parallel Old(并行)收集器,針對老年代,标記整理 CMS收集器,基于标記清理
G1收集器:整體上是基于标記 整理 ,局部采用複制
對檔案名為Test.java的java代碼描述正确的是()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
正确答案: C 你的答案: B
輸出:0000
輸出:123
編譯報錯
輸出:No name
子類的構造方法總是先調用父類的構造方法,如果子類的構造方法沒有明顯地指明使用父類的哪個構造方法,子類就調用父類不帶參數的構造方法。
而父類沒有無參的構造函數,是以子類需要在自己的構造函數中顯示的調用父類的構造函數。
方法重寫應遵循“三同一小一大”原則:
- “三同”:即方法名相同,形參清單相同,傳回值類型相同;
- “一小”:子類方法聲明抛出的異常比父類方法聲明抛出的異常更小或者相等;
- “一大”:子類方法的通路修飾符應比父類方法更大或相等。
關于下面程式 ThisTest .java 運作結果 說法正确的是 : ( )
1 2 3 4 5 6 7 8 | |
正确答案: B 你的答案: D (錯誤)
11
722
22
程式有編譯錯誤
+号兩邊如果有一邊為字元類型 則為字元串連接配接 如果變為y+z+x 則等價于(y+z)+x 輸出47