Java常考面試題(二)


      序言

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

                

                                                                                  ------WZY

一、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變量的值也會因此改變,因為傳遞的是一個地址,一個地址中的值改變了,所有指向該地址的對象的值也會相應的改變

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM