繼承的本質(zhì)就是避免重復(fù)藐守,extends 關(guān)鍵字實現(xiàn)繼承挪丢。繼承了父類的類擁有父類的一切功能和數(shù)據(jù),子類可以直接訪問父類中的非私有的屬性和行為卢厂。Java只支持單繼承乾蓬,不支持多繼承。
Java中的所有類都隱式繼承了Object類慎恒,Object類的重要方法有:equals()任内,作用是判斷一個對象是否等于另一個對象。
擁有自反性
x.equals(x)
對稱性
x.equals(y)
等價于
y.equals(x)
傳遞性
x.equals(y),y.equals(z)
等價于
x.equals(z)
非空
x.equals(null)
將return false
toString()是對一個對象提供字符串表示的融柬。
繼承中的類結(jié)構(gòu)與初始化順序
初始化順序:父類的靜態(tài)變量-->父類的靜態(tài)代碼塊-->子類的靜態(tài)變量-->子類的靜態(tài)代碼快-->父類的非靜態(tài)變量(父類的非靜態(tài)代碼塊)-->父類的構(gòu)造函數(shù)-->子類的非靜態(tài)變量(子類的非靜態(tài)代碼塊)-->子類的構(gòu)造函數(shù)
值得注意的是:父類的非靜態(tài)變量(父類的非靜態(tài)代碼塊)是同一級的死嗦,看哪個部分寫在類的最前面誰就先被執(zhí)行,子類的非靜態(tài)變量(子類的非靜態(tài)代碼塊)也是一樣粒氧。
驗證代碼:
package com.hts.test;
public class Test {
public static void main(String[] args) {
Child c=new Child();
}
}
class Parent {
public static PrintMessage a=new PrintMessage("父類靜態(tài)成員被初始化");
private PrintMessage b=new PrintMessage("父類非靜態(tài)成員被初始化");
static{
System.out.println("父類的靜態(tài)代碼塊被執(zhí)行");
}
{
System.out.println("父類的非靜態(tài)代碼塊被執(zhí)行");
}
public Parent(){
System.out.println("父類的構(gòu)造方法被執(zhí)行");
}
}
class Child extends Parent{
public static PrintMessage a1=new PrintMessage("子類靜態(tài)成員被初始化");
private PrintMessage b1=new PrintMessage("子類非靜態(tài)成員被初始化");
static {
System.out.println("子類的靜態(tài)代碼塊被執(zhí)行");
}
{
System.out.println("子類的非靜態(tài)代碼塊被執(zhí)行");
}
public Child(){
System.out.println("子類的構(gòu)造函數(shù)被執(zhí)行");
}
}
class PrintMessage{
public PrintMessage(String mes){
System.out.println(mes);
}
}
輸出結(jié)果:
覆蓋/重寫
子類中出現(xiàn)與父類一模一樣的方法時(除了權(quán)限修飾符越除,權(quán)限修飾符大于等于不包括private,返回值類型,方法名和參數(shù)列表相同)摘盆,會出現(xiàn)覆蓋操作翼雀,也稱為重寫或者復(fù)寫。
覆蓋注意事項:
- 覆蓋時孩擂,子類方法權(quán)限一定要大于等于父類方法權(quán)限狼渊;
- 靜態(tài)只能覆蓋靜態(tài)。
- @OverRide 防止手殘造成錯誤 提示編譯器進行檢查
- 子類的構(gòu)造方法中默認有一個super()类垦,所以囤锉,子類的初始化過程中,會先執(zhí)行父類的初始化护锤。
super和this有什么區(qū)別?
super是一個關(guān)鍵字,代表父類的存儲空間標識酿傍。(可以理解為父親的地址)
super和this的用法相似烙懦。
this代表對象的引用(誰調(diào)用就代表誰);
super代表當前子類對父類的引用赤炒。
1.成員變量
this.變量 -- 本類的
super.變量 -- 父類的
2.構(gòu)造方法
this(...) -- 本類的
super(...) -- 父類的
3.成員方法
this.方法名() -- 本類的
super.方法名() -- 父類的
final關(guān)鍵字
可以聲明某個變量是不變的氯析,final是線程安全的。
用途 :
- 使用在方法參數(shù)中
- 用于對象莺褒,對象指向的內(nèi)容可變掩缓,但是對象指向的東西不能改變(地址不能變)
- 使用public static final 定義常量,提升代碼可讀性遵岩。命名約定:全大寫
final 修飾class 你辣,標志這個類就不可繼承了,JDK為什么有很多方法不能被繼承尘执?會破壞所有使用Integer類的地方
好處舍哄,可以保證沒人繼承,不會造成破壞我的約定誊锭,運行時方法是確定的表悬,不會有多態(tài)
單例模式
這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式丧靡。
這種模式涉及到一個單一的類蟆沫,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建温治。這個類提供了一種訪問其唯一的對象的方式饭庞,可以直接訪問,不需要實例化該類的對象罐盔。
注意:
1但绕、單例類只能有一個實例。
2、單例類必須自己創(chuàng)建自己的唯一實例捏顺。
3六孵、單例類必須給所有其他對象提供這一實例。
優(yōu)點:
1幅骄、在內(nèi)存里只有一個實例劫窒,減少了內(nèi)存的開銷,尤其是頻繁的創(chuàng)建和銷毀實例(比如管理學(xué)院首頁頁面緩存)拆座。
2主巍、避免對資源的多重占用(比如寫文件操作)。
使用場景:
1挪凑、要求生產(chǎn)唯一序列號孕索。
2、WEB 中的計數(shù)器躏碳,不用每次刷新都在數(shù)據(jù)庫里加一次搞旭,用單例先緩存起來。
3菇绵、創(chuàng)建的一個對象需要消耗的資源過多肄渗,比如 I/O 與數(shù)據(jù)庫的連接等。
實現(xiàn)
步驟 1
創(chuàng)建一個 Singleton 類咬最。
SingleObject.java
public class SingleObject {
//創(chuàng)建 SingleObject 的一個對象
private static SingleObject instance = new SingleObject();
//讓構(gòu)造函數(shù)為 private翎嫡,這樣該類就不會被實例化
private SingleObject(){}
//獲取唯一可用的對象
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
步驟 2
從 singleton 類獲取唯一的對象。
SingletonPatternDemo.java
public class SingletonPatternDemo {
public static void main(String[] args) {
//不合法的構(gòu)造函數(shù)
//編譯時錯誤:構(gòu)造函數(shù) SingleObject() 是不可見的
//SingleObject object = new SingleObject();
//獲取唯一可用的對象
SingleObject object = SingleObject.getInstance();
//顯示消息
object.showMessage();
}
}
步驟 3
執(zhí)行程序永乌,輸出結(jié)果:
Hello World!