15道類和對象面試題,快看看本身會幾道

###java

1.類與對象有哪些區別?面試

類是一個抽象的概念,是對某一事物的描述;而對象是類的實例,是實實在在存在的個體。編程

好比:「男人」就是一個類(一個概念),而老田(田維常)就是實實在在的一個「對象」。app

注意:對象中又有類對象,即Class對象,可是類對象始終仍是對象,不是類,這兩個概念別搞混淆了。ide

2.Java 中能夠多繼承嗎?函數

Java 中只能單繼承,但能夠實現多接口,而且支持多層繼承。this

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

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

4.覆蓋和重載有哪些區別?對象

  • 重寫(Override)從字面上看,重寫就是 從新寫一遍的意思。其實就是在子類中把父類自己有的方法從新寫一遍。子類繼承了父類原有的方法,但有時子類並不想原封不動的繼承父類中的某個方法,因此在方法名,參數列表,返回類型(除過子類中方法的返回值是父類中方法返回值的子類時)都相同的狀況下, 對方法體進行修改或重寫,這就是重寫。但要注意子類函數的訪問修飾權限不能少於父類的。

public class Father {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Son s = new Son();
        s.sayHello();
    }

    public void sayHello() {
        System.out.println("Hello");
    }}class Son extends Father{

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("hello by ");
    }}

重寫 總結:

1.發生在父類與子類之間

2.方法名,參數列表,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同

3.訪問修飾符的限制必定要大於被重寫方法的訪問修飾符(public>protected>default>private)

4.重寫方法必定不能拋出新的檢查異常或者比被重寫方法的更加寬泛的檢查型異常

  • 重載(Overload)在一個類中,同名的方法若是有不一樣的參數列表(參數類型不一樣、參數個數不一樣甚至是參數順序不一樣)則視爲重載。同時,重載對返回類型沒有要求,能夠相同也能夠不一樣,但不能經過返回類型是否相同來判斷重載。

public class Father {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Father s = new Father();
        s.sayHello();
        s.sayHello("wintershii");

    }

    public void sayHello() {
        System.out.println("Hello");
    }

    public void sayHello(String name) {
        System.out.println("Hello" + " " + name);
    }}

重載 總結:1.重載Overload是一個類中多態性的一種表現 2.重載要求同名方法的參數列表不一樣(參數類型,參數個數甚至是參數順序) 3.重載的時候,返回值類型能夠相同也能夠不相同。沒法以返回型別做爲重載函數的區分標準。

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

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

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

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

6.說說構造方法的特色有哪些?

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

  • 構造方法必須與類名相同;

  • 構造方法沒有返回類型(默認返回本類類型);

  • 構造方法不能被繼承、覆蓋、直接調用;

  • 類定義時提供了默認的無參構造方法;

  • 構造方法能夠私有,外部沒法使用私有構造方法建立對象。

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

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

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

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

8.類加載順序

總體


44376f95a6c1ab359d0dec97f8eca3e4.jpg


細分


71f1cd189fbf16a81c0b7feec456c24d.jpg


如下程序執行的結果是?

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 語言中,變量不能被重寫。

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

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

  • 基礎概念:this 是訪問本類實例屬性或方法;super 是子類訪問父類中的屬性或方法。

  • 查找範圍:this 先查本類,沒有的話再查父類;super 直接訪問父類。

  • 使用:this 單獨使用時,表示當前對象;super 在子類覆蓋父類方法時,訪問父類同名方法。

10.在靜態方法中可使用 this 或 super 嗎?爲何?

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

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

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

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

  • 靜態方法中不能使用 this 和 super。

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

final也是不少面試喜歡問的地方,但我以爲這個問題很無聊,一般能回答下如下5點就不錯了:

  • 被final修飾的類不能夠被繼承

  • 被final修飾的方法不能夠被重寫

  • 被final修飾的變量不能夠被改變.若是修飾引用,那麼表示引用不可變,引用指向的內容可變.

  • 被final修飾的方法,JVM會嘗試將其內聯,以提升運行效率

  • 被final修飾的常量,在編譯階段會存入常量池中.

除此以外,編譯器對final域要遵照的兩個重排序規則更好:

在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操做之間不能重排序 初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操做之間不能重排序.

經典使用場景:Integer,String等類中有使用到。

13.覆蓋 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) 必須返回假。

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

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

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

如何使用 clone() 方法?

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

public 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);
    }}

對象克隆是原型模式的經典實現。

15.java中對象的建立方式有哪幾種?

java中提供瞭如下四種建立對象的方式:

  • new建立新對象

  • 經過反射機制

  • 採用clone機制

  • 經過序列化機制

相關文章
相關標籤/搜索