先說說Java面向物件的概念
Java是完全的面向物件編程(Object Oriented Programming),簡稱 OOP ,
面向物件編程的思維方式更加符合大家的日常生活,因為我們的現實世界都是由各種各樣的物件組成,大到飛機、火車、樓房,小到一只狗、筆記本電腦、一本書都是實實在在的物件,然而每個物件都有自己的狀態和行為,我們可以通過物件來完成一定的任務,
例如:我們乘坐飛機從深圳飛到湘西去旅游,我們可以直接使用飛機的飛行能力,而不用管飛機這個物件是如何制造的,直接使用即可,
使用面向物件的方式來描述由物件組成的世界,更加符合人類的思維方式;
因為軟體出現的目的就是為了:
- 用計算機的語言描述現實世界
- 用計算機解決現實世界的問題
Java是目前最為流行的面向物件的編程語言(Python可能不服),擁有面向物件的四大特征:
- 封裝:隱藏內部實作細節,對外提供可訪問的方法
- 繼承:子類自動繼承父類中所有的非私有屬性和方法
- 多型:同一事物,多種不同的表示形態,例如:多載、重寫
- 抽象:可以不用管具體的實作,定義統一的抽象規則
面向物件編程是Java的核心思想,但是對于初學者來說,學習起來還是比較抽象,
所以建議初學者可以配合視頻一起學習,反復觀看,從而掌握其中精華,
視頻我推薦看動力節點老杜講的Java,每一個知識點都講得無比詳細
https://www.bilibili.com/video/BV1Rx411876f
Java面向物件面試題
1、面向物件包括哪些特性,怎么理解的?
(1)封裝:通常認為封裝是把資料和操作資料的方法系結起來,對資料的訪問只能通過已定義的介面,面向物件的本質就是將現實世界描繪成一系列完全自治、封閉的物件,我們在類中撰寫的方法就是對實作細節的一種封裝;我們撰寫一個類就是對資料和資料操作的封裝,可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程介面,
(2)繼承:繼承是從已有類得到繼承資訊創建新類的程序,提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類),繼承讓變化中的軟體系統有了一定的延續性,同時繼承也是封裝程式中可變因素的重要手段,
(3)多型:多型性是指允許不同子型別的物件對同一訊息作出不同的回應,簡單的說就是用同樣的物件參考呼叫同樣的方法但是做了不同的事情,多型性分為編譯時的多型性和運行時的多型性,如果將物件的方法視為物件向外界提供的服務,那么運行時的多型性可以解釋為:當 A系統訪問B系統提供的服務時,B 系統有多種提供服務的方式,但一切對 A 系統來說都是透明的,方法多載(overload)實作的是編譯時的多型性(也稱為前系結),而方法重寫(override)實作的是運行時的多型性(也稱為后系結),
運行時的多型是面向物件最精髓的東西,要實作多型需要做兩件事:
1、方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);
2、物件造型(用父型別參考指向子型別物件,這樣同樣的參考呼叫同樣的方法就會根據子類物件的不同而表現出不同的行為)
(4)抽象:抽象是將一類物件的共同特征總結出來構造類的程序,包括資料抽象和行為抽象兩方面,抽象只關注物件有哪些屬性和行為,并不關注這些行為的細節是什么,
2、訪問權限修飾符 public、private、protected, 以及不寫(默認)時的區別?
3、Java中為什么要用 clone?
在實際編程程序中,我們常常要遇到這種情況:有一個物件 A,在某一時刻 A 中已經包含了一些有效值,此時可能會需要一個和 A 完全相同新物件 B,并且此后對 B 任何改動都不會影響到 A 中的值,也就是說,A 與 B 是兩個獨立的物件,但 B 的初始值是由 A 物件確定的,在 Java 語言中,用簡單的賦值陳述句是不能滿足這種需求的,要滿足這種需求雖然有很多途徑,但clone()方法是其中最簡單,也是最高效的手段,
說到物件的克隆,涉及到深克隆和淺克隆?
- 淺克隆:創建一個新物件,新物件的屬性和原來物件完全相同,對于非基本型別屬性,仍指向原有屬性所指向的物件的記憶體地址,
- 深克隆:創建一個新物件,屬性中參考的其他物件也會被克隆,不再指向原有物件地址,
4、new一個物件的程序和clone一個物件的區別?
new 運算子的本意是分配記憶體,程式執行到 new 運算子時,首先去看 new 運算子后面的型別,因為知道了型別,才能知道要分配多大的記憶體空間,分配完記憶體之后,再呼叫建構式,填充物件的各個域,這一步叫做物件的初始化,構造方法回傳后,一個物件創建完畢,可以把他的參考(地址)發布到外部,在外部就可以使用這個參考操縱這個物件,
clone 在第一步是和 new 相似的,都是分配記憶體,呼叫 clone 方法時,分配的記憶體和原物件(即呼叫 clone 方法的物件)相同,然后再使用原物件中對應的各個域,填充新物件的域,填充完成之后,clone方法回傳,一個新的相同的物件被創建,同樣可以把這個新物件的參考發布到外部,
5、Java中實作多型的機制是什么?
Java中的多型靠的是父類或介面定義的參考變數可以指向子類或具體實作類的實體物件,而程式呼叫的方法在運行期才動態系結,就是參考變數所指向的具體實體物件的方法,也就是記憶體里正在運行的那個物件的方法,而不是參考變數的型別中定義的方法,
6、談談你對多型的理解?
多型就是指程式中定義的參考變數所指向的具體型別和通過該參考變數發出的方法呼叫在編程時并不確定,而是在程式運行期間才確定,即一個參考變數到底會指向哪個類的實體物件,該參考變數發出的方法呼叫到底是哪個類中實作的方法,必須在程式運行期間才能決定,因為在程式運行時才確定具體的類,這樣,不用修改源代碼,就可以讓參考變數系結到各種不同的物件上,從而導致該參考呼叫的具體方法隨之改變,即不修改程式代碼就可以改變程式運行時所系結的具體代碼,讓程式可以選擇多個運行狀態,這就是多型性,
7、談談你對面向物件的理解?
所謂物件就是由一組資料結構和處理它們的方法組成的,重點“資料”包括物件的特性、狀態等的靜態資訊;“方法” 也就是行為,包括該物件的對資料的操作、功能等能動資訊,把相同行為的物件歸納為類,類是一個抽象的概念,物件是類的具體,
簡單點說:物件就是類的實體,例如:小品演員就是一個類,趙本山就是一個物件,
面向物件的目的:解決軟體系統的可擴展性,可維護性和可重用性,
面向物件的三大特性:封裝、多型和繼承:
(1)封裝(對應可擴展性):隱藏物件的屬性和實作細節,僅對外公開介面,控制在程式中屬性的讀和修改的訪問級別,封裝是通過訪問控制符(public protected private)來實作,一個類就可看成一個封裝,
(2)繼承(重用性和擴展性):子類繼承父類,可以繼承父類的方法和屬性,可以對父類方向進行覆寫(實作了多型),但是繼承破壞了封裝,因為他是對子類開放的,修改父類會導致所有子類的改變,因此繼承一定程度上又破壞了系統的可擴展性,只有明確的IS-A關系才能使用,繼承要慎用,盡量優先使用組合,
(3)多型(可維護性和可擴展性):介面的不同實作方式即為多型,介面是對行為的抽象,剛才在封裝提到,找到變化部分并封裝起來,但是封裝起來后,怎么適應接下來的變化?這正是介面的作用,介面的主要目的是為不相關的類提供通用的處理服務,我們可以想象一下,比如鳥會飛,但是超人也會飛,通過飛這個介面,我們可以讓鳥和超人,都實作這個介面,
面向物件編程(OOP)其實就是一種設計思想,在程式設計程序中把每一部分都盡量當成一個物件來考慮,以實作軟體系統的可擴展性,可維護性和可重用性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311923.html
標籤:Java
