Java常考面試題(二)

一杯涼茶發表於2016-11-09

      序言

         昨天剛開始的”每日5題面試“這類文章,感覺還不錯,把一些平常看似懂了的東西,弄清楚了。就像什麼是虛擬機器?這個問題,看起來知道,但是要說出個所以然來,又懵逼了,經常回過頭來看看做過的面試題,試著用自己的話說出來,看會不會,不會的話就繼續看看,理解理解。

                

                                                                                  ------WH

一、Java中的方法覆蓋(Overriding)和方法過載(Overloading)是什麼意思?

       自己解答:

            覆蓋:又稱作重寫, 前提條件:繼承。   子類將父類中的某個方法,原封不動的抄下來,方法體中就自己寫

                   注意:子類重寫父類的方法,訪問修飾符的許可權不能低於父類方法的訪問修飾符, 其它返回值、方法名、引數,必須一樣。

            過載:不需要繼承,在自己類中,和自己本類中的某個方法名相同,引數不同,其他沒有限制, 這就是方法的過載。

    

       參考答案: 

            Java中的方法過載發生在同一個類裡面兩個或者是多個方法的方法名相同但是引數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,引數列表和返回型別。覆蓋者可能不會限制它所覆蓋的方法的訪問。


       自我評價:
            大概的要點已經答道,語言上面有點欠缺,不精煉。一看就是個菜鳥~

            1、過載:方法名相同、引數不相同。 修飾符、返回值無所謂。 

            2、重寫:方法名、引數、返回值都必須相同、修飾符 >= 父類方法修飾符

                注意:重寫是為了進行多型的使用,多型的好處就是能讓程式碼的維護效能更高。而過載是為了一個方法能根據引數的不同,選擇更多的功能。

           

     

二、Java中,什麼是建構函式?什麼是建構函式過載?什麼是複製建構函式?            

        自己解答:

            建構函式:方法名和類名相同,並且沒有返回值。每個類中預設有一個無參建構函式。

            建構函式過載:在建構函式中,引數不同,其他相同, 作用,做一些初始化的操作。

            複製建構函式:這個不知道。。。 沒遇到過這種需要複製建構函式的情況。

 

        參考答案:

            當新物件被建立的時候,建構函式會被呼叫。每一個類都有建構函式。在程式設計師沒有給類提供建構函式的情況下,Java編譯器會為這個類建立一個預設的建構函式。
            Java中建構函式過載和方法過載很相似。可以為一個類建立多個建構函式。每一個建構函式必須有它自己唯一的引數列表。
            Java不支援像C++中那樣的複製建構函式,這個不同點是因為如果你不自己寫建構函式的情況下,Java不會建立預設的複製建構函式。

            

        自我評價:

            總體也答道點上了,複製建構函式那個概念,對C++的學習不深,其實沒怎麼學,所以不知道

            1、建構函式在新物件被建立的時候會呼叫。每一個類都有建構函式,建構函式的名字跟類名相同,沒有返回值,每個類有一個預設的無參建構函式,

            2、建構函式的過載:跟方法的過載類似,唯一的不同就是功能不一樣,建構函式的過載,增加不同引數,來達到初始化屬性的目的。

 

3、Java支援多繼承麼?

        自己解答:

            這個問題,有點傻,學了java的人都知道, 肯定不知道多繼承啊,java是隻支援單繼承,多實現。我記得C++中就支援多繼承。

        

        參考答案:

            Java中類不支援多繼承,只支援單繼承(即一個類只有一個父類)。 但是java中的介面支援多繼承,,即一個子介面可以有多個父介面。(介面的作用是用來擴充套件物件的功能,一個子介面繼承多個父介面,說明子介面擴充套件了多個功能,當類實現介面時,類就擴充套件了相應的功能)。

 

        自我評價:   

            只說出表面答案來,不能更深入的講解,說明自己所儲備的知識不夠多,而且自己確實不知道介面可以多繼承。這個可以記住。

            1、java 是支援單繼承、多實現

            2、實現說的就是一個類實現某個介面,介面中只申明方法,但是沒有方法體,介面可以多繼承。一個介面繼承多個介面,說明該介面擴充套件更多的功能。

 

4、介面和抽象類的區別是什麼?

        自己解答:

             介面:介面中只定義方法,方法中沒有方法體, 也就是說只是宣告有哪些功能,功能具體的實現要靠實現該介面的類去做。關鍵字interface

             抽象類:對一類事物相同的部分抽取出來,可以有具體的方法,也可以有不寫方法體的方法。特點,關鍵字 abstract

             區別:

                關鍵字  interface  abstract

                介面中全是方法的宣告,沒有方法體   抽象類中可以有方法體,也可以只申明方法,還可以有成員變數。

                介面需要實現 implements   抽象類需要繼承 extends

                實現介面,需要實現介面中所有的方法,  繼承抽象類,需要重寫抽象類中所有的抽象方法,如果不重寫,則該類也還是抽象類。抽象類不能new 物件。

 

        參考答案:

             Java提供和支援建立抽象類和介面。它們的實現有共同點,不同點在於:
             介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
             類可以實現很多個介面,但是隻能繼承一個抽象類
               類可以不實現抽象類和介面宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。
               抽象類可以在不提供介面方法實現的情況下實現介面。
             Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。
             Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。
               介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。
               也可以參考JDK8中抽象類和介面的區別 

 

        自我評價

              看起來好像知道,其實不明白他們兩個其中的聯絡和區別。還有一個理解錯了,介面中也能有屬性,但是每個變數都宣告為 public static final 。也就是常量了

              1、介面是最頂級的抽象,抽象類次之。

              2、介面中所有的變數都市 public static final  而抽象類中能包含任意型別的變數  介面中所有的方法都是abstract。

              3、介面是最頂級的抽象,所以它只宣告方法,而沒有方法體,而抽象類既可以有方法體的方法,也可以沒有,

              4、一個類中有抽象方法,則該類一定要是抽象類。而且繼承該類的類必須重寫抽象方法,

              5、abstract只能修飾類和方法,不能修飾屬性。

              6、一個方法被abstract修飾了,則該方法只能宣告,沒有方法體。

            

        重新解答:

              區別: 三個方面、 關鍵字、方法、成員變數、其他。

                關鍵字: 介面 interface    抽象類 abstract

                介面是最頂級的抽象 抽象類次之

                介面中所有的方法都市抽象的,且介面只能被實現,不能被繼承,而抽象類中的方法可以是抽象的,也可以不是,抽象的方法都沒有方法體

                介面的成員變數都市public static final 修飾的 是常量   而抽象類則可以是各種型別。

      

五、什麼是值傳遞和引用傳遞?

        自己解答:

              值傳遞:針對的是基本資料型別,是把自己的值進來傳遞

              引用傳遞:針對的是引用資料型別,傳遞的是地址值,

                注意:有一個話說,java中所有的都是值傳遞,沒有引用傳遞,其實說的是真正的值和引用值(地址值)。

 

        參考答案:

              值傳遞是對基本型變數而言的,傳遞的是該變數的一個副本,改變副本不影響原變數.

              引用傳遞一般是對於物件型變數而言的,傳遞的是該物件地址的一個副本, 並不是原物件本身 所以對引用物件進行操作會同時改變原物件.一般認為,java內的傳遞都是值傳遞
          
            這樣可能更容易理解。
              public void add(int a) { int b = a; } 這個可以看作是值傳遞,a是基本資料型別,他把他的值傳給了b public void add(Object obj) { Object objTest = obj; } 這個可以看作是址傳遞,obj是引用資料型別,是把他棧中指向堆中的物件的地址值賦值給了objTest. 這時候就同時有兩個引用指向了堆中的某個Object物件 其實這樣看來,java應該只有值傳遞的。如果是基本資料型別,傳遞的就是實際的值. 如果是引用資料型別,傳遞的就是該引用的地址值.

 

        自我評價:

              自己解答的不夠深入,只是表面上的解答

              1、值傳遞是針對基本引用型別,如果將值賦予另一個a變數,改變a變數的值,原先變數的值並不會因此改變

              2、引用傳遞針對的是引用基本型別,如果將a變數的值賦給b變數,改變b變數的的值,a變數的值也會因此改變,因為傳遞的是一個地址,一個地址中的值改變了,所有指向該地址的物件的值也會相應的改變

 

相關文章