【面試題每日學習】8

1. 類的組成部分有哪些?

答:在 Java 語言中,類主要是由方法和變量兩部分組成。java

2. 類與對象有哪些區別?

答:類是一個抽象的概念,是對某一事物的描述;而對象是類的實例,是實實在在存在的個體。好比,「人」就是一個類(一個概念),而老王就是實實在在的一個「對象」。編程

3. Java 中能夠多繼承嗎?

答:Java 中只能單繼承,但能夠實現多接口。ide

4. Java 中爲何不能實現多繼承?

答:從技術的實現角度來講,是爲了下降編程的複雜性。假設 A 類中有一個 m() 方法,B 類中也有一個 m() 方法,若是 C 類同時繼承 A 類和 B 類,那調用 C 類的 m() 方法時就會產生歧義,這無疑增長了程序開發的複雜性,爲了不這種問題的產生,Java 語言規定不能多繼承類,但能夠實現多接口。函數

5. 覆蓋和重載有哪些區別?

答:覆蓋和重載的區別以下:this

  • 覆蓋(Override)是指子類對父類方法的一種重寫,只能比父類拋出更少的異常,訪問權限不能比父類的小,被覆蓋的方法不能是 private,不然只是在子類中從新定義了一個方法;
  • 重載(Overload)表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數列表各不相同。

6. 如下不屬於重載特性的是?

A:方法的參數類型不一樣 B:方法的返回值不一樣 C:方法的參數個數不一樣 D:方法的參數順序不一樣線程

答:Bcode

7. 爲何方法不能根據返回類型來區分重載?

答:由於在方法調用時,若是不指定類型信息,編譯器就不知道你要調用哪一個方法了。好比,如下代碼:對象

float max(int x,int y);
int max(int x,int y);
// 方法調用
max(1,2);

由於 max(1,2) 沒有指定返回值,編譯器就不知道要調用哪一個方法了。繼承

8. 構造方法有哪些特徵?

答:構造方法的特徵以下:接口

  • 構造方法必須與類名相同;
  • 構造方法沒有返回類型(void 也不能有);
  • 構造方法不能被繼承、覆蓋、直接調用;
  • 類定義時提供了默認的無參構造方法;
  • 構造方法能夠私有,外部沒法使用私有構造方法建立對象。

9. 構造函數能不能被覆蓋?能不能被重載?

答:構造函數能夠重載,但不能覆蓋。

10. 如下說法正確的是?

A:類中的構造方法不能忽略 B:構造方法能夠做爲普通方法被調用 C:構造方法在對象被 new 時被調用 D:一個類只能有一個構造方法

答:C

11. 如下程序執行的結果是?

class ExecTest {
    public static void main(String[] args) {
        Son son = new Son();
    }
}
class Parent{
    {
        System.out.print("1");
    }
    static{
        System.out.print("2");
    }
    public Parent(){
        System.out.print("3");
    }
}
class Son extends Parent{
    {
        System.out.print("4");
    }
    static{
        System.out.print("5");
    }
    public Son(){
        System.out.print("6");
    }
}

答:打印的結果是:251346

加載順序以下:

  • 執行父類的靜態成員;
  • 執行子類的靜態成員;
  • 父類的實例成員和實例初始化;
  • 執行父類構造方法;
  • 子類的實例成員和實例初始化;
  • 子類構造方法。

12. 如下程序執行的結果是?

class A {
    public int x = 0;
    public static int y = 0;
    public void m() {
        System.out.print("A");
    }
}
class B extends A {
    public int x = 1;
    public static int y = 2;
    public void m() {
        System.out.print("B");
    }
    public static void main(String[] args) {
        A myClass = new B();
        System.out.print(myClass.x);
        System.out.print(myClass.y);
        myClass.m();
    }
}

答:打印的結果是:00B

題目解析:在 Java 語言中,變量不能被重寫。

13. 如下程序執行的結果是?

class A {
    public void m(A a) {
        System.out.println("AA");
    }
    public void m(D d) {
        System.out.println("AD");
    }
}
class B extends A {
    @Override
    public void m(A a) {
        System.out.println("BA");
    }
    public void m(B b) {
        System.out.println("BD");
    }
    public static void main(String[] args) {
        A a = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        a.m(a);
        a.m(b);
        a.m(c);
        a.m(d);
    }
}
class C extends B{}
class D extends B{}

答:打印結果以下。

BA
BA
BA
AD

題目解析:

  • 第一個 BA:由於 A 的 m() 方法,被子類 B 重寫了,因此輸出是:BA;
  • 第二個 BA:由於 B 是 A 的子類,當調用父類 m() 方法時,發現 m() 方法被 B 類重寫了,因此會調用 B 中的 m() 方法,輸出就是:BA;
  • 第三個 BA:由於 C 是 B 的子類,會直接調用 B 的 m() 方法,因此輸出就是:BA;
  • 第四個 AD:由於 D 是 A 的子類,因此會調用 A 的 m() 方法,因此輸出就是:AD。

14. Java 中的 this 和 super 有哪些區別?

答:this 和 super 都是 Java 中的關鍵字,起指代做用,在構造方法中必須出如今第一行,它們的區別以下。

  • 基礎概念:this 是訪問本類實例屬性或方法;super 是子類訪問父類中的屬性或方法。
  • 查找範圍:this 先查本類,沒有的話再查父類;super 直接訪問父類。
  • 使用:this 單獨使用時,表示當前對象;super 在子類覆蓋父類方法時,訪問父類同名方法。

15. 在靜態方法中能夠使用 this 或 super 嗎?爲何?

答:在靜態方法中不能使用 this 或 super,由於 this 和 super 指代的都是須要被建立出來的對象,而靜態方法在類加載的時候就已經建立了,因此沒辦法在靜態方法中使用 this 或 super。

16. 靜態方法的使用須要注意哪些問題?

答:靜態方法的使用須要注意如下兩個問題:

  • 靜態方法中不能使用實例成員變量和實例方法;
  • 靜態方法中不能使用 this 和 super。

17. final 修飾符的做用有哪些?

答:final 修飾符做用以下:

  • 被 final 修飾的類不能被繼承;
  • 被 final 修飾的方法不能被重寫;
  • 被 final 修飾的變量不能被修改。

18. 覆蓋 equals() 方法的時候須要遵照哪些規則?

答:Oracle 官方的文檔對於 equals() 重寫制定的規則以下。

  • 自反性:對於任意非空的引用值 x,x.equals(x) 返回值爲真。
  • 對稱性:對於任意非空的引用值 x 和 y,x.equals(y) 必須和 y.equals(x) 返回相同的結果。
  • 傳遞性:對於任意的非空引用值 x、y 和 z,若是 x.equals(y) 返回值爲真,y.equals(z) 返回值也爲真,那麼 x.equals(z) 也必須返回值爲真。
  • 一致性:對於任意非空的引用值 x 和 y,不管調用 x.equals(y) 多少次,都要返回相同的結果。在比較的過程當中,對象中的數據不能被修改。
  • 對於任意的非空引用值 x,x.equals(null) 必須返回假。

此題目不要求記憶,能知道大概便可,屬於加分項題目。

19. 在 Object 中 notify() 和 notifyAll() 方法有什麼區別?

答:notify() 方法隨機喚醒一個等待的線程,而 notifyAll() 方法將喚醒全部在等待的線程。

20. 如何使用 clone() 方法?

答:若是是同一個類中使用的話,只須要實現 Cloneable 接口,定義或者處理 CloneNotSupportedException 異常便可,請參考如下代碼:

class CloneTest implements Cloneable {
    int num;
    public static void main(String[] args) throws CloneNotSupportedException {
        CloneTest ct = new CloneTest();
        ct.num = 666;
        System.out.println(ct.num);
        CloneTest ct2 = (CloneTest) ct.clone();
        System.out.println(ct2.num);
    }
}

若是非內部類調用 clone() 的話,須要重寫 clone() 方法,請參考如下代碼:

class CloneTest implements Cloneable {
    int num;
    public static void main(String[] args) throws CloneNotSupportedException {
        CloneTest ct = new CloneTest();
        ct.num = 666;
        System.out.println(ct.num);
        CloneTest ct2 = (CloneTest) ct.clone();
        System.out.println(ct2.num);
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class CloneTest2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        CloneTest ct = new CloneTest();
        ct.num = 666;
        System.out.println(ct.num);
        CloneTest ct2 = (CloneTest) ct.clone();
        System.out.println(ct2.num);
    }
}
相關文章
相關標籤/搜索