面向物件和面向程序的區別
- 面向程序性能更優一些,所以一般是使用在底層,例如,單片機、嵌入式開發
- 面向物件相對于面向程序效率較低,但是面向物件具有繼承封裝多型的特性使得面向物件的程式易維護,易擴展,易復用
多型是如何實作的
介面和抽象類的區別
設計層面
- 抽象是對類的抽象,是一種模板設計
- 介面是對行為的抽象,是一種行為規范
使用層面
- 類可以實作多個介面,但是只能繼承一個抽象類
- 類可以不實作抽象類和介面中的抽象方法,但是這種情況下,類必須宣告為抽象類
- 介面中宣告的變數默認是被
final修飾,而抽象類中可以包含非final的屬性 - 介面中的方法默認是被
public修飾,而抽象類的方法可以被private,protected或者public修飾 - 介面中所有方法都是抽象方法,而抽象類中的方法可以同時包含抽象和非抽象的方法
物件創建+物件初始化程序
物件是如何創建的?
- 判斷對應的類是否已經加載,需要先完成類加載
- 記憶體分配
- 初始化默認值
- 設定物件頭(物件頭中包含了CG年齡,GC年齡,是否充當鎖等)
- 執行
init()初始化方法
子實作類是如何初始化的?
-
類加載程序中
-
初始化父類中的靜態成員變數和靜態代碼塊
-
初始化子類中的靜態成員變數和靜態代碼塊
-
-
物件創建程序中
-
初始化父類的普通成員變數和代碼塊,再執行父類的構造方法
-
初始化子類的普通成員變數和代碼塊,再執行子類的構造方法
-
多載和重寫的區別
-
多載:多載同名稱的方法,但是需要引數的個數,型別,順序至少有一個不同
-
重寫
-
存在于父類和子類之間
-
方法名,引數,回傳值都相等
-
被
final修飾的方法不能被重寫 -
問題:建構式能否被重寫?
不能,因為建構式不會被繼承
-
Object中常用方法
-
getClass()獲取物件對應的 Class 物件
-
finalize()實體被垃圾回收器回收的時候觸發的操作
-
hashCode() -
equals()問題:為什么需要 equals 和 hashcode 保持一致?
-
wait() / notfiy() -
clone()clone()屬于淺拷貝,且呼叫方法必須讓類實作Clonable介面-
問題:淺拷貝和深拷貝的區別?
淺拷貝對于物件屬性并不會拷貝物件,而會拷貝參考指向原物件
深拷貝拷貝物件屬性時會拷貝一份新的物件
-
問題:如何實作深拷貝?
使用序列化可以實作深拷貝
-
String類
常用的方法
length()charAt()toCharArray()equals()indexOf()subString()startsWith()toLowerCase()/toUpperCase()
String
特點:被final修飾,每次修改數值都會重新生成String類
StringBuilder
特點:使用建造者模式創建出來的物件,可以進行字串的修改
StringBuffer
特點:執行緒安全
基本資料型別
- 數值型:byte,short,int,long
- 浮點型:float double
- 布爾型:boolean
- 字符型:char
關鍵字
final
- final修飾的類無法被繼承
- final修飾的方法無法被重寫,可以多載(被static修飾的方法同樣無法被重寫,但是子類可以存在一個同樣的方法)
- final修飾的屬性被賦值后不可以修改(被final修飾的屬性必須在被使用前賦值)
static
-
變數
-
靜態變數當且僅當在類初次加載時會被初始化
-
靜態變數屬于類,被所有的物件所共享
-
靜態成員變數可以通過類直接訪問
-
-
方法
-
靜態方法,可以直接通過類名去訪問
-
靜態方法中不可以使用this和super,不可以直接訪問物件的實體變數和實體方法,可以直接訪問類的靜態變數和靜態方法
-
-
代碼塊
類加載時執行一次(初始化階段)
權限修飾符
-
private -
default同包的類可以訪問
-
protect子類可以訪問
-
public全部都可以訪問
JDK1.8特性
- 函式式介面
Lamdba運算式steam流Data日期類optional來防止空指標例外
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511031.html
標籤:其他
上一篇:文章詳情頁制作
