面向對象和麵向過程的區別 面向過程性能更優一些,所以一般是使用在底層,例如,單片機、嵌入式開發 面向對象相對於面向過程效率較低,但是面向對象具有繼承封裝多態的特性使得面向對象的程式易維護,易擴展,易復用 多態是如何實現的 介面和抽象類的區別 設計層面 抽象是對類的抽象,是一種模板設計 介面是對行為的 ...
面向對象和麵向過程的區別
- 面向過程性能更優一些,所以一般是使用在底層,例如,單片機、嵌入式開發
- 面向對象相對於面向過程效率較低,但是面向對象具有繼承封裝多態的特性使得面向對象的程式易維護,易擴展,易復用
多態是如何實現的
介面和抽象類的區別
設計層面
- 抽象是對類的抽象,是一種模板設計
- 介面是對行為的抽象,是一種行為規範
使用層面
- 類可以實現多個介面,但是只能繼承一個抽象類
- 類可以不實現抽象類和介面中的抽象方法,但是這種情況下,類必須聲明為抽象類
- 介面中聲明的變數預設是被
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
來防止空指針異常