一、面向對象的特性和對這些特性的理解
默認狀況下面向對象有3大特性:封裝、繼承、多態,若是非要說出四大特性,那麼就把抽象加上去。程序員
封裝:一般認爲,封裝就是把數據和操做數據的方法綁定起來,對數據的訪問只能經過已定義的接口。面向對象的本質就是將現實世界描繪成一系列徹底自治、封閉的對象。咱們在類中編寫的方法就是對實現細節的一種封裝;咱們編寫的的一個類就是對數據和數據操做的封裝。能夠說,封裝就是隱藏一切能夠隱藏的東西,只向外界提供最簡單的編程接口。
繼承:繼承是從已有的類中獲得繼承信息,而且建立新類的過程。提供繼承信息的類被稱爲父類(超類、基類);獲得繼承信息的類稱爲子類(派生類)。繼承讓變化中的軟件系統具備了必定的延續性,同時繼承也是封裝程序中可變因素的重要手段。
多態性:多態性是指容許不一樣子類型的對象對同一消息作出不一樣的響應。簡單地說就是用一樣的對象引用調用一樣的方法可是作了不一樣的事情。多態性分爲編譯時多態和運行時的多態。若是將對象的方法看做爲對象向外界提供的服務,那麼運行時多態能夠理解爲:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來講都是透明的。方法重載實現的是編譯時多態,也稱爲前綁定,而方法重寫實現的是運行時多態,也稱爲後綁定。運行時的多態是面向對象最精髓的東西,要實現多態須要作兩件事:第一是方法重寫,子類繼承父類並重寫父類中已有的或者抽象的方法。第二是,對象造型,用父類型引用子類型對象,這樣的引用調用一樣的方法就會根據子類對象的不一樣而變現出不一樣的行爲。
抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。
二、爲何須要clone對象?
在實際編程中,咱們經常會遇到這種狀況:有一個對象A,在某一時刻A中已經包含了一些有效值,此時可能會須要一個和A徹底相同的新對象B,而且此後B作的任何改動都不會再影響到A,也就是說,A與B是兩個徹底獨立的個體,可是B的初始值是由A對象肯定的。在Java中,使用簡單的賦值語句並不能知足這種需求,知足這種需求是能夠有許多其餘途徑的,可是使用clone()方法無疑是最簡單最高效的手段。編程
三、new一個對象和clone一個對象的區別?
new操做符的本意是分配內存:程序執行到new操做符時,首先去看一下new操做符後面的類型,由於知道了類型,才能夠根據類型知道須要分配多大的內存空間,分配完內存空間以後,再調用構造函數,填充對象的各個域,這一步叫作對象的初始化。構造方法返回後,一個對象就算建立完畢了,能夠把他的引用(地址)發佈到外部,在外部就可使用這個引用(地址)來操縱這個對象了。clone在第一步和new是類似的,也是首先分配內存,調用clone方法時,分配的內存和原對象(即調用clone方法的那個對象)相同,而後再使用原對象中對應的各個域去填充新對象的各個域,填充完成以後,clone方法返回,一個新的相同的對象就被建立成功了,一樣能夠把這個新對象的引用(地址)發佈到外部使用。函數
四、Java爲何沒有goto語句?
goto是Java中的保留字,在目前的版本中Java沒有使用,根據Java之父Gosling給出的Java關鍵字列表,其中有goto和const這兩個關鍵字,可是目前這兩個關鍵字沒法使用,在將來版本的Java中會不會啓用這兩個關鍵字並不知道,所以有的地方也把他們成爲保留字,其實保留字這個詞應該是具備更加準確的含義,熟悉C語言編程的程序員都知道,在系統類庫中使用過的有特殊意義的單詞或單詞組合都被視爲保留字。(水題,湊個數的,嘿嘿,瞭解便可)對象
五、Java中&和&&的區別?
&運算符有兩種用法:按位與和邏輯與。繼承
&&運算符是短路與運算,邏輯與和短路與的差異仍是很大的,雖然兩者都是要求運算符左右兩邊都爲true整個表達式的值纔是true。接口
&&之因此被稱爲短路與是由於若是&&左邊的表達式爲false,則右邊的表達式會被直接短路掉,不會再執行了,在實際開發中,咱們可能更多時候須要的是&&。例如在驗證用戶登陸斷定用戶名不是null並且也不是空字符串的時候,應該寫爲username != null && !username.equals(""),注意:兩者的順序不能改變!更不能使用&,由於第一個條件若是不成立,根本不能進行空字符串的equals比較,不然會產生NullPointerException異常。內存
邏輯或|和短路或||的差異也是如此。開發
六、==和equals的區別?
equals和==最大的區別就是:equals是一個方法,==是一個運算符!字符串
==:若是比較的對象是基本數據類型,則比較的是數值是否相等,若是比較的雙方是引用數據類型,則比較的是引用對象的地址值是否相同。io
equals():用來比較兩個對象的內容是否相同,equals方法不能用於基本數據類型的變量,若是沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址。
七、抽象方法(abstract)是否能夠同時是靜態的?是否同時是本地的(native)?是否能夠同時是synchronized?
都不能。抽象方法須要子類重寫,而靜態的方法都是沒法被重寫的,所以兩者是矛盾的。本地方法由本地代碼(C/C++)實現的,抽象方法是沒有實現的,也是矛盾的。synchronized和方法的實現細節有關係,抽象方法不涉及具體實現細節,所以也是互相矛盾的。
八、靜態變量和實例變量的區別是什麼?
靜態變量:被static修飾符修飾的變量就是靜態變量,也稱爲類變量,它是屬於類的,不屬於類的任何一個對象,一個類無論建立多少個對象,靜態變量在內存中有且僅有一個。靜態變量能夠實現讓多個對象共享內存。
實例變量:實例變量必須依存於某一具體的實例,須要首先建立對象,而後經過對象才能夠訪問到它。
九、break和continue的區別是什麼?
break和continue都是用來控制循環語句的,break用於徹底結束一個循環,跳出循環體執行循環後面的語句,continue用於跳出本次循環,繼續判斷循環條件是否知足,知足的話繼續執行下次循環。
十、抽象類(abstract)和接口(interface)之間有什麼異同?
不一樣:
抽象類:
抽象類中能夠定義構造器;
抽象類中能夠有抽象方法和具體方法;
抽象類中能夠定義成員變量;
有抽象方法的類必須被定義爲抽象類,而抽象類中沒必要必定要有抽象方法;
抽象類中能夠包含靜態方法;
一個類只能繼承一個抽象類;
抽象類中的成員能夠是private、默認、protected、public的。
接口:
接口中不能定義構造器;
接口中的方法所有是抽象方法,不包含具體實現;
接口中的成員所有是public的;
接口中定義的成員變量實際上都是常量;
接口中不能有靜態方法
一個類能夠實現多個接口。
相同:
接口和抽象類都不能實例化; 抽象類和接口類型均可以做爲引用類型; 一個類若是繼承了某個抽象類或者實現了某個接口,都須要對其中的抽象方法進行所有實現,不然該類仍然須要被聲明爲抽象類。