天天看點

java一些筆記正确答案: A   你的答案: B (錯誤)正确答案: C   你的答案: B正确答案: D E   你的答案: A D E正确答案: C   你的答案: B正确答案: B   你的答案: D (錯誤)

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

public

class

Base

{

private

String baseName = 

"base"

;

public

Base()

{

callName();

}

public

void

callName()

{

System. out. println(baseName);

}

static

class

Sub 

extends

Base

{

private

String baseName = 

"sub"

;

public

void

callName()

{

System. out. println (baseName) ;

}

}

public

static

void

main(String[] args)

{

Base b = 

new

Sub();

}

}

正确答案: 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

class

Person {

String name = 

"No name"

;

public

Person(String nm) {

name = nm;

}

}

class

Employee extends Person {

String empID = 

"0000"

;

public

Employee(String id) {

empID = id;

}

}

public

class

Test {

public

static

void

main(String args[]) {

Employee e = 

new

Employee(

"123"

);

System.out.println(e.empID);

}

}

正确答案: C   你的答案: B

輸出:0000      
輸出:123      
編譯報錯      
輸出:No name      

子類的構造方法總是先調用父類的構造方法,如果子類的構造方法沒有明顯地指明使用父類的哪個構造方法,子類就調用父類不帶參數的構造方法。

而父類沒有無參的構造函數,是以子類需要在自己的構造函數中顯示的調用父類的構造函數。

方法重寫應遵循“三同一小一大”原則:

  1. “三同”:即方法名相同,形參清單相同,傳回值類型相同;
  2. “一小”:子類方法聲明抛出的異常比父類方法聲明抛出的異常更小或者相等;
  3. “一大”:子類方法的通路修飾符應比父類方法更大或相等。

關于下面程式 ThisTest .java 運作結果 說法正确的是 : ( )

1 2 3 4 5 6 7 8

public class ThisTest {

public static void main(String args[]) {

String x=

"7"

;       

int y = 2;

int z=2;              

System.out.println(x+y+z);

}  

}

正确答案: B   你的答案: D (錯誤)

11      
722      
22      
程式有編譯錯誤      
java一些筆記正确答案: A   你的答案: B (錯誤)正确答案: C   你的答案: B正确答案: D E   你的答案: A D E正确答案: C   你的答案: B正确答案: B   你的答案: D (錯誤)

+号兩邊如果有一邊為字元類型  則為字元串連接配接 如果變為y+z+x 則等價于(y+z)+x  輸出47

繼續閱讀