1. 程式人生 > >Java筆試面試題(三)

Java筆試面試題(三)

共享 ble ati uil sys res 表達式 split 底層

每日一句:想,都是問題;做,才是答案。

  1. 構造器Constructor是否可被Override?
    構造器Constructor不能被繼承,因此不能重寫Override,但是可以被重載Overload。
  2. 接口是否可繼承接口?抽象類是否可實現(implement)接口?抽象類是否可繼承具體類(concrete class)?抽象類中是否可以有靜態的類方法?
    接口可以繼承接口。抽象類可以實現接口。抽象類可以繼承具體類。抽象類中可以有靜態的類方法。

  3. 寫clone方法時通常都有一行代碼,是什麽?
    clone有缺省行為,super.clone(); 因為首先要把父類中的成員復制到位,然後才是復制自己的成員。

  4. 面向對象的特征有哪些方面?
    (1)封裝

封裝是保證軟件部件具有優良的模塊性基礎,封裝的目標就是要實現軟件部件的“高內聚,低耦合”,防止程序相互依賴性而帶來的變動影響。

(2)抽象

抽象就是找出一些事物的相似性和共性之處,然後將這些事物歸為一個類,這些類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將註意力集中在與當前目標有關的方面。

(3)繼承

在定義和實現一個類的時候,可以在一個已存在的類的基礎上來進行,把這個已存在的類所定義的內容作為自己的內容,並可以加入若幹新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關系,提高了軟件的可重用性和可擴展性。

(4)多態

多態是指程序中定義的變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。

  1. Java中實現多態的機制是什麽?
    靠的是父類或者是接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體事例對象的方法,也就是內存中正在執行的那個對象的方法,而不是引用變量的類型中定義的方法。

  2. abstract(抽象)類和interface(接口)有什麽區別?
    含有abstract修飾符的類即為抽象類,abstract類不能創建實例對象。含有abstract方法的類必須定位為abstract class,abstract class中的方法不一定是抽象的。抽象類中定義的抽象方法必須在具體(Concrete)類中實現,所以不能有抽象構造方法和抽象靜態方法。如果子類沒有實現父類中所有的抽象方法,那麽子類也必須定義為abstract類。

接口(interface)可以說是抽象類的一種特例,接口中的所有方法必須是抽象的。接口中的方法默認定義為 public abstract 類型,接口中的成員變量默認為 public static final。

具體的語法區別為:

(1)抽象類可以有構造方法,接口中不能有構造方法。

(2)抽象類中可以有普通成員變量,接口中沒有普通成員變量。

(3)抽象類中可以包含非抽象的普通方法,接口中所有方法必須是抽象的。

(4)抽象類中的抽象方法的訪問類型可以是public, protected 和默認,但接口中抽象方法只能是public類型的,病默認為 public abstract 類型。

(5)抽象類中可以包含靜態方法,接口中不行。

(6)抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以是任意,但接口中的變量只能是 public static final 類型,默認為此類型。

(7)一個類可以實現多個接口,但只能繼承一個抽象類。

應用上的區別:

抽象類在代碼實現方面發揮作用,可以實現代碼的重用;而接口更多的是在系統架構設計方法中發揮作用,主要用於定義模塊之間的通信契約。

  1. 抽象方法是否可以同時是static的,是否同時是native,是否可同時是synchronized?
    abstract 的method 不可以同時是static的,因為抽象方法是要被子類繼承實現的,而static與子類沒關系。

native方法表示該方法要用另一種依賴平臺的編程語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract同用。例如:FileOutputStream類實現要與硬件打交道,底層的實現使用操作系統相關api實現,如在windows用C語言實現的,所以,查看jdk源碼可以發現FileOutputStream的open方法的定義如下:

private native void open(String name)throws FileNotFoundException;
關於synchronized與abstract一起用的問題,從來沒有見過,synchronized應該是作用在一個具體的方法上才有意義,而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this指什麽。

  1. 什麽是內部類?Static Nested Class 和 Inner Class 的不同?
    內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員,內部類可以直接訪問外部類中的成員變量,內部類可以定義在外部類的方法中,如下所示:
public class Outer{
    int out_x = 0;
    public void method(){
        Inner1 inner1 = new Inner1();
        public class Inner2{//在方法體內定義的內部類
            public method(){
            out_x = 3;
            }
        }
        Inner2 inner2 = new Inner2();
    }
    public Class Inner1{//在方法體外定義的內部類
    }
}

在方法體外面定義的內部類的訪問類型可以是public,protected,默認,private等4種類型,這就好像類中定義成員變量的訪問類型一樣,他們決定了這個內部類的定義對其他類是否可見。

  1. 內部類可以引用它的包含類的成員嗎?有沒有什麽限制?
    完全可以。如果不是靜態內部類,沒有什麽限制。

如果你把靜態嵌套類當做內部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變量,而只能訪問外部類中的靜態成員,例如以下代碼:

class Outer{
    static int x;
    static class Inner{
        void test(){
            System.out.println(x);
        }
    }
}
  1. 匿名內部類是否可以繼承其他類,是否可以實現接口?
    可以繼承其他類和實現接口。不僅可以,而是必須!

  2. super.getClass()方法調用。
    下面的程序輸出結果是多少?

import java.util.Date;
public class Test extend Date{
public static void main(String[] srgs){
new Test().test();
}
public void test(){
System.out.println(super.getClass().getName());
}
}

答案:Test

32. jdk中那些類是不能被繼承的?
不能繼承的類是那些用final關鍵字修飾的類。一般比較基本的類型或者防止擴展類無意間破壞原來 方法的實現的類型都應該是final的,在jdk中System,String,StringBuffer等都是基本類型。

33. String是最基本的數據類型嗎?
基本數據類型包括byte、short、int、long、float、double、boolean、char。

java.lang.String類是final類型的,因此是不可以繼承這個類的,不能修改這個類,為了提高效率節省時間,我們應該用StringBuffer類。

34. String s = "Hello"; s = s + "world"; 這兩行代碼執行後,原始的String對象中的內容到底變了沒有?
沒有。因為String類被設計成不可變類,所以它的所有對象都是不可變對象。在這段代碼中,s原先指向一個String對象,內容是‘Hello’,然後對s進行了+操作,這時,s不指向原來那個對象了,而是指向了另一個String對象,內容為“Helloworld”,原來那個對象還存在於內存中,只是s這個引用變量不再指向它了。

35. 是否可以繼承String類?
不能,String類是final類。

36. String s =  new String("abc"); 創建了幾個String Object? 二者之間有什麽區別?
兩個對象。“abc”對應一個對象,這個對象放在字符串常量緩沖區,常量“abc”不管出現多少遍,都是緩沖區中的那一個。new String每寫一遍,就創建一個新對象。

37. String和StringBuffer的區別。
Java平臺提供的兩個類String和StringBuffer都可以存儲和操作字符串,即包含多個字符的字符數據。String類表示內容不可改變的字符串。而StringBuffer類表示內容可變的字符串。另外,String實現了equals方法,new String("abc").equals(new String("abc"))的結果為true,而StringBuffer沒有實現equals方法new StringBuffer("abc").equals(new StringBuffer("abc"))的結果為false。
38. StringBuffer和StringBuilder的區別。
StringBuffer和StringBuilder類都表示內容可修改的字符串類,StringBuilder是線程不安全的,運行效率高,如果一個字符串變量是在方法裏面定義,這種情況只可能有一個線程訪問它,不存在不安全的因素,則用StringBuilder。如果要在類裏面定義成員變量,並且這個類的實例對象會在多線程環境下使用,那麽最好用StringBuffer。

39. 如何把一段逗號分隔的字符串轉換成一個數組?
參考:

(1)用正則表達式,代碼大概為:

`String[] result = orgStr.split(",");`
(2)用StringTokenizer,代碼為:

StringTokenizer tokener = StringTokenizer(orgStr, ",");

String[] result = new String[tokener.countTokens()];

int i = 0;

while(tokener.hasNext()){result[i++] = tokener.nextToken();}


40. 數組有沒有length()方法?String有沒有length()方法?
數組沒有此方法,有length屬性;String有length()方法。

Java筆試面試題(三)