IT公司Java筆試題及解答

字號:

準備了《IT公司Java筆試題及解答》,供大家參考!
    出處:網(wǎng)友指出。
    12. 0.6332的數(shù)據(jù)類型是()A float     B double     C Float      D Double答案:B解析:默認為double型,如果為float型需要加上f顯示說明,即0.6332f
    13. 下面哪個流類屬于面向字符的輸入流(  )A  BufferedWriter           B  FileInputStream          C  ObjectInputStream          D  InputStreamReader 答案:A 解析:Java的IO操作中有面向字節(jié)(Byte)和面向字符(Character)兩種方式。
    面向字節(jié)的操作為以8位為單位對二進制的數(shù)據(jù)進行操作,對數(shù)據(jù)不進行轉換,這些類都是InputStream和OutputStream的子類。
    面向字符的操作為以字符為單位對數(shù)據(jù)進行操作,在讀的時候?qū)⒍M制數(shù)據(jù)轉為字符,在寫的時候?qū)⒆址D為二進制數(shù)據(jù),這些類都是Reader和Writer的子類??偨Y:以InputStream(輸入)/OutputStream(輸出)為后綴的是字節(jié)流;          以Reader(輸入)/Writer(輸出)為后綴的是字符流。擴展:Java流類圖結構,一目了然,解決大部分選擇題:
    14. Java接口的修飾符可以為()A private     B protected     C final       D abstract答案:CD解析:接口很重要,為了說明情況,這里稍微啰嗦點:(1)接口用于描述系統(tǒng)對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;(2)接口僅僅描述系統(tǒng)能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;(3)接口不涉及和任何具體實例相關的細節(jié),因此接口沒有構造方法,不能被實例化,沒有實例變量,只有靜態(tài)(static)變量;(4)接口的中的變量是所有實現(xiàn)類共有的,既然共有,肯定是不變的東西,因為變化的東西也不能夠算共有。所以變量是不可變(final)類型,也就是常量了。(5) 接口中不可以定義變量?如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過 實現(xiàn)接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態(tài)變量 a。按照 Java 的語義,我們可以不通過實現(xiàn)接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那么實現(xiàn)接口 A 的所有對象也都會自動擁有這一改變后的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟著變了。這和抽象類有什么區(qū)別呢,怎么體現(xiàn)接口更高的抽象級別呢,怎么體現(xiàn)接口提供的統(tǒng)一的協(xié)議呢,那還要接口這種抽象來做什么呢?所以接口中 不能出現(xiàn)變量,如果有變量,就和接口提供的統(tǒng)一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現(xiàn)接口的對象提供一個統(tǒng) 一的屬性。通俗的講,你認為是要變化的東西,就放在你自己的實現(xiàn)中,不能放在接口中去,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現(xiàn) implements)開放,接口是對開閉原則的一種體現(xiàn)。所以:接口的方法默認是public abstract;接口中不可以定義變量即只能定義常量(加上final修飾就會變成常量)。所以接口的屬性默認是public static final 常量,且必須賦初值。注意:final和abstract不能同時出現(xiàn)。
    15. 不通過構造函數(shù)也能創(chuàng)建對象嗎()A 是     B 否答案:A解析:Java創(chuàng)建對象的幾種方式(重要):(1) 用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
    (2) 運用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
    (3) 調(diào)用對象的clone()方法。
    (4) 運用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法。(1)和(2)都會明確的顯式的調(diào)用構造函數(shù) ;(3)是在內(nèi)存上對已有對象的影印,所以不會調(diào)用構造函數(shù) ;(4)是從文件中還原類的對象,也不會調(diào)用構造函數(shù)。
    16. ArrayList list = new ArrayList(20);中的list擴充幾次()A 0     B 1     C 2      D 3答案:A解析:這里有點迷惑人,大家都知道默認ArrayList的長度是10個,所以如果你要往list里添加20個元素肯定要擴充一次(擴充為原來的1.5倍),但是這里顯示指明了需要多少空間,所以就一次性為你分配這么多空間,也就是不需要擴充了。
    17. 下面哪些是對稱加密算法()A DES   B AES   C DSA   D RSA答案:AB解析:常用的對稱加密算法有:DES、3DES、RC2、RC4、AES常用的非對稱加密算法有:RSA、DSA、ECC使用單向散列函數(shù)的加密算法:MD5、SHA
    18.新建一個流對象,下面哪個選項的代碼是錯誤的?()A)new BufferedWriter(new FileWriter("a.txt"));B)new BufferedReader(new FileInputStream("a.dat"));C)new GZIPOutputStream(new FileOutputStream("a.zip"));D)new ObjectInputStream(new FileInputStream("a.dat"));答案:B
    解析:請記得13題的那個圖嗎?Reader只能用FileReader進行實例化。
    19. 下面程序能正常運行嗎()public class NULL {
        public static void haha(){
            System.out.println("haha");
        }
        public static void main(String[] args) {
            ((NULL)null).haha();
        }
    }復制代碼
    答案:能正常運行解析:輸出為haha,因為null值可以強制轉換為任何java類類型,(String)null也是合法的。但null強制轉換后是無效對象,其返回值還是為null,而static方法的調(diào)用是和類名綁定的,不借助對象進行訪問所以能正確輸出。反過來,沒有static修飾就只能用對象進行訪問,使用null調(diào)用對象肯定會報空指針錯了。這里和C++很類似。這里感謝@ 30.下面是People和Child類的定義和構造方法,每個構造方法都輸出編號。在執(zhí)行new Child("mike")的時候都有哪些構造方法被順序調(diào)用?請選擇輸出結果 ( )class People {
        String name;
        public People() {
            System.out.print(1);
        }
        public People(String name) {
            System.out.print(2);
            this.name = name;
        }
    }
    class Child extends People {
        People father;
        public Child(String name) {
            System.out.print(3);
            this.name = name;
            father = new People(name + ":F");
        }
        public Child() {
            System.out.print(4);
        }
        
    }復制代碼
    A312              B 32               C 432              D 132答案:D解析:考察的又是父類與子類的構造函數(shù)調(diào)用次序。在Java中,子類的構造過程中必須調(diào)用其父類的構造函數(shù),是因為有繼承關系存在時,子類要把父類的內(nèi)容繼承下來。但如果父類有多個構造函數(shù)時,該如何選擇調(diào)用呢?第一個規(guī)則:子類的構造過程中,必須調(diào)用其父類的構造方法。一個類,如果我們不寫構造方法,那么編譯器會幫我們加上一個默認的構造方法(就是沒有參數(shù)的構造方法),但是如果你自己寫了構造方法,那么編譯器就不會給你添加了,所以有時候當你new一個子類對象的時候,肯定調(diào)用了子類的構造方法,但是如果在子類構造方法中我們并沒有顯示的調(diào)用基類的構造方法,如:super();  這樣就會調(diào)用父類沒有參數(shù)的構造方法。    第二個規(guī)則:如果子類的構造方法中既沒有顯示的調(diào)用基類構造方法,而基類中又沒有無參的構造方法,則編譯出錯,所以,通常我們需要顯示的:super(參數(shù)列表),來調(diào)用父類有參數(shù)的構造函數(shù),此時無參的構造函數(shù)就不會被調(diào)用。總之,一句話:子類沒有顯示調(diào)用父類構造函數(shù),不管子類構造函數(shù)是否帶參數(shù)都默認調(diào)用父類無參的構造函數(shù),若父類沒有則編譯出錯。 最后,給大家出個思考題:下面程序的運行結果是什么?public class Dervied extends Base {
        private String name = "dervied";
        public Dervied() {
            tellName();
            printName();
        }
        
        public void tellName() {
            System.out.println("Dervied tell name: " + name);
        }
        
        public void printName() {
            System.out.println("Dervied print name: " + name);
        }
        public static void main(String[] args){
            
            new Dervied();    
        }
    }
    class Base {
        
        private String name = "base";
        public Base() {
            tellName();
            printName();
        }
        
        public void tellName() {
            System.out.println("Base tell name: " + name);
        }
        
        public void printName() {
            System.out.println("Base print name: " + name);
        }
    }復制代碼