天天看點

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