Java面試題

1.

abstract class Name {
    private String name;
    public abstract boolean isStupidName(String name) {}
}

答案: 錯。abstract method必須以分號結尾,且不帶花括號。

2.

public class Something {
    void doSomething () {
        private String s = "";
        int l = s.length();
    }
}

答案: 錯。局部變量前不能放置任何訪問修飾符 (private,public,和protected)。final可以用來修飾局部變量

(final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)。


3.

abstract class Something {
    private abstract String doSomething ();
}

答案: 錯。abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實現)具體細節的,怎麼可以用private把abstract

method封鎖起來呢? (同理,abstract method前不能加final)。


4.

public class Something {
    public int addOne(final int x) {
        return ++x;
    }
}

這個比較明顯。

答案: 錯。int x被修飾成final,意味着x不能在addOne method中被修改。


5.

public class Something {
    public static void main(String[] args) {
        Other o = new Other();
        new Something().addOne(o);
    }
    public void addOne(final Other o) {
        o.i++;
    }
}
class Other {
    public int i;
}

答案: 正確。在addOne method中,參數o被修飾成final。如果在addOne method裏我們修改了o的reference

(比如: o = new Other();),那麼如同上例這題也是錯的。但這裏修改的是o的member vairable

(成員變量),而o的reference並沒有改變。


6.

class Something {
    int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}

答案: 正確。輸出的是"i = 0"。int i屬於instant variable (實例變量,或叫成員變量)。instant variable有default value。int的default value是0。

7.

class Something {
    final int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}

答案: 錯。final int i是個final的instant variable (實例變量,或叫成員變量)。final的instant variable沒有default value,必須在constructor (構造器)結束之前被賦予一個明確的值。可以修改爲"final int i = 0;"。

8.

public class Something {
    public static void main(String[] args) {
        Something s = new Something();
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}

答案: 錯。看上去在main裏call doSomething沒有什麼問題,畢竟兩個methods都在同一個class裏。但仔細看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能訪問non-static instant variable。


9.

此處,Something類的文件名叫OtherThing.java

class Something {
    private static void main(String[] something_to_do) { 
        System.out.println("Do something ...");
    }
}

答案: 正確。從來沒有人說過Java的Class名字必須和其文件名相同。但public class的名字必須和文件名相同。


10.

interface A{
    int x = 0;
}
class B{
    int x = 1;
}
class C extends B implements A {
    public void pX(){
        System.out.println(x);
    }
    public static void main(String[] args) {
        new C().pX();
    }
}

答案:錯誤。在編譯時會發生錯誤(錯誤描述不同的JVM有不同的信息,意思就是未明確的x調用,兩個x都匹配(就象在同時import java.util和java.sql兩個包時直接聲明Date一樣)。對於父類的變量,可以用super.x來明確,而接口的屬性默認隱含爲 public static final.所以可以通過A.x來明確。


11.

interface Playable {
    void play();
}
interface Bounceable {
    void play();
}
interface Rollable extends Playable, Bounceable {
    Ball ball = new Ball("PingPang");
}
class Ball implements Rollable {
    private String name;
    public String getName() {
        return name;
    }
    public Ball(String name) {
        this.name = name; 
    }
    public void play() {
        ball = new Ball("Football");
        System.out.println(ball.getName());
    }
}

這個錯誤不容易發現。

答案: 錯。"interface Rollable extends Playable, Bounceable"沒有問題。interface可繼承多個interfaces,所以這裏沒錯。問題出在interface Rollable裏的"Ball ball = new Ball("PingPang");"。任何在interface裏聲明的interface variable (接口變量,也可稱成員變量),默認爲public static final。也就是說"Ball ball = new Ball("PingPang");"實際上是"public static final Ball ball = new Ball("PingPang");"。在Ball類的Play()方法中,"ball = new Ball("Football");"改變了ball的reference,而這裏的ball來自Rollable interface,Rollable interface裏的ball是public static final的,final的object是不能被改變reference的。因此編譯器將在"ball = new Ball("Football");"這裏顯示有錯。

 




3、繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什麼? 

答:父類: 

package test; 
public class FatherClass { 
    public FatherClass() { 
        System.out.println("FatherClass Create"); 
    } 
}

子類: 

package test;
import test.FatherClass; 
public class ChildClass extends FatherClass { 
    public ChildClass() { 
        System.out.println("ChildClass Create"); 
    } 
    public static void main(String[] args) { 
        FatherClass fc = new FatherClass(); 
        ChildClass cc = new ChildClass(); 
    } 
}

輸出結果: 

C:>java test.ChildClass 

FatherClass Create 

FatherClass Create 

ChildClass Create 

4、內部類的實現方式? 

答:示例代碼如下: 

package test; 
    public class OuterClass { 
        private class InterClass { 
            public InterClass() { 
                System.out.println("InterClass Create"); 
            } 
        } 
        public OuterClass() { 
            InterClass ic = new InterClass(); 
                System.out.println("OuterClass Create"); 
            } 
        public static void main(String[] args) { 
            OuterClass oc = new OuterClass(); 
        } 
}

輸出結果: 

C:>java test/OuterClass 

InterClass Create 

OuterClass Create 

再一個例題: 

public class OuterClass { 
    private double d1 = 1.0; 
    //insert code here 
}

You need to insert an inner class declaration at line 3. Which two inner class declarations are 

valid?(Choose two.) 

A. 

class InnerOne{ 
    public static double methoda() {return d1;} 
}

B. 

public class InnerOne{ 
    static double methoda() {return d1;} 
}

C. 

private class InnerOne{ 
    double methoda() {return d1;} 
}

D. 

static class InnerOne{ 
    protected double methoda() {return d1;} 
}

E. 

abstract class InnerOne{ 
    public abstract double methoda(); 
}

說明如下: 

一.靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。 故 A、B 錯 

二.靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;return d1 出錯。故 D 錯 

三.非靜態內部類的非靜態成員可以訪問外部類的非靜態變量。 故 C 正確 

四.答案爲C、E 



String是最基本的數據類型嗎?

基本數據類型包括byte、int、char、long、float、double、boolean和short。

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

原始類型封裝類

booleanBoolean

charCharacter

byteByte

shortShort

intInteger

longLong

floatFloat

doubleDouble

引用類型和原始類型的行爲完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值爲 null,而原始類型實例變量的缺省值與它們的類型有關。

運行時異常與一般異常有何異同?

異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。


Collection 和 Collections的區別。 

  Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.

Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。


HashMap和Hashtable的區別。 

    HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。

HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因爲contains方法容易讓人引起誤解。 

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 

Hashtable和HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。


Overloaded的方法是否可以改變返回值的類型?

Overloaded的方法是可以改變返回值的類型。


abstract class和interface有什麼區別?

聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的所有抽象方法提供實現,否則它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類可以在類中實現這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然後,它可以在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作爲引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

heap和stack有什麼區別。

棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照後進先出的方式進行處理。

堆是棧的一個組成元素

forward 和redirect的區別

forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。

    redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛纔請求的所有參數重新請求,所以session,request參數都可以獲取。 

Static Nested Class 和 Inner Class的不同。[/b] 

    Static Nested Class是被聲明爲靜態(static)的內部類,它可以不依賴於外部類實例被實例化。而通常的內部類需要在外部類實例化後才能實例化。

什麼時候用assert。 

    assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;如果該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啓。爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的。


 

short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯? 

    short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)

short s1 = 1; s1 += 1;(可以正確編譯)


String s = new String("xyz");創建了幾個String Object? 

    兩個


List, Set, M ASDFFBap是否繼承自Collection接口?

    List,Set是,Map不是

abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

    都不能

Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?

Set裏的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等。

    equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。

構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

是否可以繼承String類?

String類是final類故不可以繼承。

編程題: 用最有效率的方法算出2乘以8等於幾? 

2 << 3


兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

不對,有相同的hash code。


Java的接口和C++的虛類的相同和不同處。

由於Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裏面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈活性,因爲接口中沒有任何實現代碼。當一個類實現了接口以後,該類要實現接口裏面所有的方法和屬性,並且接口裏面的屬性在默認狀態下面都是public static,所有方法默認情況下是public.一個類可以實現多個接口。



垃圾回收的優點和原理。並考慮2種回收機制。

Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用纔有"作用域"。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作爲一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

請說出你所知道的線程同步的方法。

wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。

sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。

notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。

Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。 


描述一下JVM加載class文件的原理機制?

JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。

char型變量中能不能存貯一箇中文漢字?爲什麼? 

能夠定義成爲一箇中文的,因爲java中以unicode編碼,一個char佔16個字節,所以放一箇中文是沒問題的

多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼? 

多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口 

同步的實現方面有兩種,分別是synchronized,wait與notify

線程的基本概念、線程的基本狀態以及狀態之間的關係

線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。

Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。 


問:怎樣讓char類型的東西轉換成int類型? 

答:

char c = 'A'; 

int i = c; 

//反過來只要作強制類型轉換就行了 

c = (char) I;


87已有學員信息表{學號;姓名},表中已有記錄:{1,張一;2,張二;…….100,張一百},現在要把李四放到學號54的位置,後面的其他學員,學號依次遞增,請寫出sql語句實現。

已有學員信息表{學號,班級,學科,姓名,成績},現要查詢出各班語文成績前10名,並且數學成績不在倒數10名範圍內的人員信息,請寫出sql語句實現。

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章