天天看點

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 

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語句實作。