Java寶典(一)

-switch語句能做用在byte上,可否做用在long上,可否做用在String上?java

-在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量,整數表達式能夠是int基本類型或Integer包裝類型,因爲byte,short,char均可以隱式轉換爲int,因此這些類型以及這些類型的包裝類型也是能夠的。bootstrap

顯然,long和String類型都不符合switch的語法規定,而且不能被隱式轉換成int類型,素以,它們不能做用於switch語句中。數組

 

-short s = 1; s = s + 1; 有什麼錯? short s = 1; s += 1; 有什麼錯?安全

-對於前者,因爲s + 1運算時會自動提高表達式的類型,因此結果是int類型,再賦值給short類型s時,編譯器將報告須要強制轉換類型的錯誤。多線程

對於後者,因爲+=是Java語言規定的運算符,Java編譯器會對它進行特殊處理,所以能夠正確編譯。併發

 

-char型變量中能不能存儲一箇中文漢字?爲何?app

-char型變量是用來存儲Unicode編碼字符的,unicode編碼字符集中包含了漢子,因此char型變量固然能夠存儲漢字啦。不過,若是某個特殊的漢字沒有包含在unicode編碼字符集中,那麼char型變量就不能存儲。補充說明:unicode編碼佔用兩個字節,char類型變量也是兩個字節。jvm

 

-使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變?ide

-使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容仍是能夠改變的。ui

例如,對於:

final StringBuffer a = new StringBuffer("hahaha");

執行以下語句將報告編譯器錯誤:

a = new StringBuffer("hehe");

可是,執行以下語句則能夠經過編譯:

a.append("broken");

有人在定義方法的參數時,可能想採用以下形式來阻止方法內部修改傳進來的參數對象:

public void method(final StringBuffer param)

{

 

}

實際上這是辦不到的,在該方法內部仍然能夠增長以下代碼來修改參數對象:

param.append("a");

 

-請說出做用域public,private,protected,以及不寫時的區別。

-若是在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。

做用域    當前類    同一Package    子孫類    其餘Package

public    yes      yes        yes      yes

protected  yes      yes        yes      no

friendly    yes      yes        no      no

private    yes      no        no       no

 

-線程如何同步和通信

-只有多個synchronized代碼塊使用的是同一個監視器對象,這些synchronized代碼塊之間才具備線程互斥的效果,假如a代碼塊用obj1做爲監視器對象,b代碼塊用obj2做爲監視器對象,那麼兩個併發的線程能夠同時進入這兩個代碼塊中。

對於同步方法的分析,所用的是同步監視器對象this。

對於靜態同步方法的分析,所用的同步監視器對象是類的Class對象。

 

-ClassLoader如何加載class?

-jvm裏有多個類加載,每一個類加載能夠負責加載特定位置的類。

例如,bootstrap類加載負責加載jre/lib/rt.jar中的類,咱們平時用的jdk中的類都位於rt.jar中。

extclassloader負責加載jar/lib/ext/*.jar中的類,appclassloader負責classpath指定的目錄或jar中的類。

除了bootstrap,其餘的類加載自己也都是java類,他們的父類是ClassLoader。

 

-ArrayList如何實現插入的數據按自定義的方式有序存放?

-代碼以下:

class MyBean implements Comparable{

    int age;

 

    @Override

    public int compareTo(Object o) {

        // TODO Auto-generated method stub

        if(!(o instanceof MyBean))

            throw new ClassCastException();

        MyBean other = (MyBean) o;

       

        return age > other.age ? 1 : age == other.age ? 0 : -1;

    }

}

 

class MyTreeSet{

    private ArrayList datas = new ArrayList();

   

    public void add(Object o){

        for(int i = 0; i < datas.size();i++){

            if(((MyBean) o).compareTo(datas.get(i))!= 1){

                datas.add(i,o);

            }

        }

    }

}

 

-StringBuffer與StringBuilder的區別

-由於StringBuilder是線程不安全的,運行效率高,若是一個字符串變量是在防範裏面定義,這種狀況只可能有一個線程訪問它,不存在不安全的因素了,則用StringBuilder。若是要在類裏面定義成員變量,而且這個類的實例對象會在多線程環境下使用,那麼最好用StringBuffer。

 

-構造器Constructor是否可被override?

-構造器Constructor不能被繼承,所以不能寫Override,但能夠被重載Overload。

 

-接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類?抽象類是否能夠有靜態的main方法?

-接口能夠繼承接口。抽象類能夠實現接口,抽象類能夠繼承具體類。抽象類中能夠有靜態main方法。

備註:只要明白了接口和抽象類的本質和做用,這些問題都很好回答,你想一想,若是你是java語言的設計者,你是否會提供這樣的支持,若是不提供的話,有什麼理由?若是您i沒有道理不提供,那答案就是確定的了。

只要記住抽象類與普通類惟一區別就是不能建立實例對象和容許有abstract方法。

 

-java中實現多態的機制是什麼?

-靠的是父類或接口定義的引用變量能夠指向子類或具體實現類的實例變量,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

 

-內部類能夠引用它的包含類的成員嗎?有沒有什麼限制?

-靜態內部類不能訪問外部類的普通成員,只能訪問外部類中的靜態成員。若是不是靜態內部類,則沒什麼限制,能夠訪問。

 

-Anonymous Inner Class(匿名內部類)是否能夠繼承其餘類,是否能夠implements 接口?

-不只是能夠,而是必須!

 

-String s = new String(xyz)建立了幾個String對象,兩者之間有什麼區別?

-兩個或一個。"xyz"對應一個對象,這個對象放在字符串常量緩衝區,常量"xyz"無論出現多少遍,都是緩衝區中的那一個。new String每寫一遍,就建立一個新的對象,他依據那個常量"xyz"對象的內容來建立出一個新的String對象。若是之前就用過"xyz",就不會建立「xyz」本身了,直接從緩衝區拿。

 

-數組有沒有length()這個方法,String有沒有length()這個方法?

-數組沒有length這個方法,有length屬性。String有length()這個方法。

相關文章
相關標籤/搜索