Java?super、this、static關(guān)鍵字實(shí)踐案例
一.Java繼承
(1)繼承
繼承的本質(zhì)就是代碼的復(fù)用,子類繼承父類的全局變量和方法(public,protected)
public class Animal{
public String name;
public String color;
public void run(){
}
public void eat(){
}
//....
}public class Dog extends Animal{
public String name;
public String color;
public void run(){
}
public void eat(){
}
//....
}public class Cat extends Animal{
public String name;
public String color;
public void run(){
}
public void eat(){
}
//....
}- 父類
Animal:定義了公共的成員變量name、color,以及公共方法run()、eat(),這些是動物類的通用屬性和行為。 - 子類
Dog和Cat:通過extends關(guān)鍵字繼承Animal類,從而擁有了父類的name、color、run()、eat()。
(2)繼承父類并創(chuàng)建對象在內(nèi)存當(dāng)做發(fā)生什么
創(chuàng)建子類的時候一定會去創(chuàng)建父類對象---->先創(chuàng)建父類對象,在創(chuàng)建子類對象

- 當(dāng)創(chuàng)建子類對象(如
Cat或Dog)時,會先創(chuàng)建父類Animal的對象(堆中0x1標(biāo)識的區(qū)域,包含父類的name、color、run()、eat()),再基于父類對象創(chuàng)建子類對象(如cat 0x2對應(yīng)的堆區(qū)域,繼承父類的結(jié)構(gòu)后,還會添加子類自身的特性)。

- 父類
Animal:包含構(gòu)造方法public Animal(){ System.out.println("我是Animal"); },當(dāng)父類對象被創(chuàng)建時,該構(gòu)造方法會執(zhí)行,打印 “我是 Animal”。 - 子類
Cat:繼承自Animal,其構(gòu)造方法public Cat(){ System.out.println("我是Cat"); }會在父類構(gòu)造方法執(zhí)行后執(zhí)行,打印 “我是 Cat”。 - 測試類
Test:在main方法中創(chuàng)建Cat對象Cat cat = new Cat();,觸發(fā)構(gòu)造方法的執(zhí)行鏈。
(3)Java程序?yàn)槭裁磏ew 子類對象時,結(jié)果先創(chuàng)建父類對象在創(chuàng)建子類對象
原因在于有方法重寫
*****方法重寫和方法重載的區(qū)分
1)方法重寫:父類的方法被子類重寫(父類當(dāng)中的方法不應(yīng)完全適用于子類)

- 左側(cè) “cat 0x1” 代表子類 Cat 的對象(0x1 是對象在內(nèi)存中的標(biāo)識)。
- 上方區(qū)域包含
run()、eat()方法和name=null、color=null屬性,代表父類的成員(方法和屬性)。 - 下方區(qū)域的
run()方法(淺藍(lán)色)代表子類 Cat 對父類 run () 方法的重寫—— 子類通過重寫,讓run()方法的行為更貼合 “貓” 的特性,而父類的eat()方法等未被重寫時,子類會繼承使用
2)方法重載:發(fā)生在同一個類當(dāng)中,方法名稱相同,參數(shù)列表不同的方法,叫做方法
Java程序是通過方法的簽名來驗(yàn)證這是不是一個方法(方法簽名:方法名+參數(shù)列表(數(shù)據(jù)類型)
public class Cat extends Animal {
public void run() {
System.out.println("邁開四只腳跑……");
}
public void jump(){
System.out.println("跳起來了……");
}
public void jump(int a){
System.out.println("跳起來了……");
}
public void jump(String name){
}
}在Cat類中,jump方法出現(xiàn)了多次:
public void jump(){...}(無參數(shù))public void jump(int a){...}(參數(shù)為int類型)public void jump(String name){...}(參數(shù)為String類型)這幾個方法名稱相同,但參數(shù)列表不同,屬于方法重載的典型案例;而run方法只有一個定義,不涉及重載。
(4)Java繼承層次--------->Java只支持單繼承
一個子類只能有一個父類,一個父類可以有多個父類
是用來防止因多繼承帶來的復(fù)雜邏輯和內(nèi)存管理問題

Animal是頂層父類,Cat和Dog都直接繼承自Animal(體現(xiàn) “一個父類可以有多個子類”)。Dog作為父類,又有小黑狗類、小黃狗類、小白狗類三個子類。- 圖中 “不允許” 的箭頭表示:
小黑狗類不能同時繼承Cat和Dog,因?yàn)?Java 不支持多繼承(一個子類只能有一個直接父類)。
二.super關(guān)鍵字
super代表父類,調(diào)用父類當(dāng)中的方法和變量
public void jump(int a) {
super.color = "黑色";
super.run();
super.eat();
System.out.println("貓?zhí)吡?.....");
}在jump(int a)方法中:
super.color = "黑色";:調(diào)用并設(shè)置父類的成員變量color的值為 “黑色”。super.run();、super.eat();:調(diào)用父類的run()方法和eat()方法。- 最后執(zhí)行子類自身的邏輯
System.out.println("貓?zhí)吡?hellip;…");
三.this關(guān)鍵字------------>this代表當(dāng)前對象
(1)this屬性名稱
Java中為解決變量的名稱沖突和不確定性問題,引入關(guān)鍵字this代表其所在方法的當(dāng)前對象的引用。
(2)this:方法名
代表當(dāng)前的對象調(diào)用某一方法。
(3)注意
1)不能在普通方法當(dāng)前中只能在構(gòu)造方法中使用。
2)在構(gòu)造方法當(dāng)中必須是第一條語句。
3)不能和super()一起使用。
四.static關(guān)鍵字
(1)static的 “歸屬” 本質(zhì)
static 修飾的元素屬于 “類”,而非類的 “對象(實(shí)例)”。
示例:.java 源文件(如 Hello.java)編譯為 .class 字節(jié)碼后,static 成員隨類加載到方法區(qū),不依賴對象存在。

(2)static的內(nèi)存模型(JVM 視角)
JVM 內(nèi)存分為虛擬機(jī)棧、堆、方法區(qū),static 成員的存儲規(guī)則如下:
- 靜態(tài)變量 / 方法 / 代碼塊:存儲在方法區(qū)的 “類信息” 區(qū)域,屬于類的共享資源。
- 非靜態(tài)方法:也存儲在方法區(qū),但屬于 “對象可調(diào)用” 的成員(需通過對象觸發(fā))。
- 堆內(nèi)存:僅存儲對象的實(shí)例數(shù)據(jù),
static成員不在這里。 - 虛擬機(jī)棧:存儲方法調(diào)用的棧幀,執(zhí)行
main、run等方法時的局部變量在此分配。
public class TestConfigParser {
public static void main(String[] args) {
eat();
new TestConfigParser().run();
}
public void run(){}
public static void eat(){}
}
(3) 靜態(tài)方法(類方法)
- 訪問方式:
- 推薦:
類名.方法名()(如TestConfigParser.eat()); - 不推薦:
對象.方法名()(易混淆,不體現(xiàn) “類歸屬” 本質(zhì))。
- 推薦:
- 調(diào)用限制:
- 靜態(tài)方法中不能直接調(diào)用非靜態(tài)方法(非靜態(tài)方法屬于 “對象”,靜態(tài)方法加載時可能還沒有對象);
- 非靜態(tài)方法中可以調(diào)用靜態(tài)方法(對象存在時,類一定已加載);
- 靜態(tài)方法中不能使用
this關(guān)鍵字(this代表 “當(dāng)前對象”,靜態(tài)方法不依賴對象)。
public class TestConfigParser {
public static void main(String[] args) {
new TestConfigParser().run(); // 非靜態(tài)方法需通過對象調(diào)用
}
public void run(){} // 非靜態(tài)方法
public static void eat(){} // 靜態(tài)方法
}
(4)靜態(tài)代碼塊
- 執(zhí)行時機(jī):在
main方法之前執(zhí)行,且僅執(zhí)行一次(類加載時執(zhí)行)。 - 作用:用于初始化靜態(tài)變量、加載資源(如配置文件、數(shù)據(jù)庫驅(qū)動)等 “類級別的初始化操作”。
public static void main(String[] args) {
Demo demo = new Demo();
Demo demo1 = new Demo();
Demo demo2 = new Demo();
demo.from = "中國"; // 修改靜態(tài)變量
System.out.println(demo.from); // 輸出“中國”
System.out.println(demo1.from); // 輸出“中國”
System.out.println(demo2.from); // 輸出“中國”
}(5)static的加載順序
- 規(guī)則:static修飾的代碼塊 在main方法之前執(zhí)行,先加載父類,在加載子類,創(chuàng)建子類對象之前先創(chuàng)建父類對象
。 - 示例代碼(體現(xiàn)父子類靜態(tài)加載順序):
public class Test extends Base {
static {
System.out.println("Test static");
}
public Test() {
System.out.println("Test constructor");
}
public static void main(String[] args) {
new Test();
}
}
class Base {
static {
System.out.println("Base static");
}
public Base() {
System.out.println("Base constructor");
}
}
// 執(zhí)行結(jié)果:
// Base static
// Test static
// Base constructor
// Test constructor
class Demo {
public Demo(String aa) {
System.out.println("=====" + aa);
}
static {
System.out.println("11");
}
public static Demo demo = new Demo("+++");
static {
System.out.println("22");
}
}
class Test {
public static void main(String[] args) {
Demo demo = new Demo("----");
}
}
//11
//=====+++
//22
//=====----到此這篇關(guān)于Java super、this、static關(guān)鍵字的文章就介紹到這了,更多相關(guān)java super this static關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot責(zé)任鏈模式實(shí)現(xiàn)多級校驗(yàn)
責(zé)任鏈模式是將鏈中的每一個節(jié)點(diǎn)看作是一個對象,每個節(jié)點(diǎn)處理的請求不同,且內(nèi)部自動維護(hù)一個下一節(jié)點(diǎn)對象,下面我們來聊聊springboot如何利用責(zé)任鏈模式實(shí)現(xiàn)多級校驗(yàn)吧2024-11-11
基于注解的springboot+mybatis的多數(shù)據(jù)源組件的實(shí)現(xiàn)代碼
這篇文章主要介紹了基于注解的springboot+mybatis的多數(shù)據(jù)源組件的實(shí)現(xiàn),會使用到多個數(shù)據(jù)源,文中通過代碼講解的非常詳細(xì),需要的朋友可以參考下2021-04-04
深入理解SpringMVC中央調(diào)度器DispatcherServlet
這篇文章主要介紹了SpringMVC核心之中央調(diào)度器DispatcherServlet的相關(guān)知識,包括SpringMVC請求處理過程及SrpingMVC容器和spring?IOC容器關(guān)系,需要的朋友可以參考下2022-05-05
Java中g(shù)et/post的https請求忽略ssl證書認(rèn)證淺析
因?yàn)镴ava在安裝的時候,會默認(rèn)導(dǎo)入某些根證書,所以有些網(wǎng)站不導(dǎo)入證書,也可以使用Java進(jìn)行訪問,這篇文章主要給大家介紹了關(guān)于Java中g(shù)et/post的https請求忽略ssl證書認(rèn)證的相關(guān)資料,需要的朋友可以參考下2024-01-01
Netty結(jié)合Protobuf進(jìn)行編解碼的方法
這篇文章主要介紹了Netty結(jié)合Protobuf進(jìn)行編解碼,通過文檔表述和代碼實(shí)例充分說明了如何進(jìn)行使用和操作,需要的朋友可以參考下2021-06-06
探索分析Redis?AOF日志與數(shù)據(jù)持久性
這篇文章主要為大家介紹了探索分析Redis?AOF日志與數(shù)據(jù)持久性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
java判斷l(xiāng)ist不為空的實(shí)現(xiàn),和限制條數(shù)不要在一起寫
這篇文章主要介紹了java判斷l(xiāng)ist不為空的實(shí)現(xiàn),和限制條數(shù)不要在一起寫。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Spring Boot 2.0多數(shù)據(jù)源配置方法實(shí)例詳解
這篇文章主要介紹了Spring Boot 2.0多數(shù)據(jù)源配置方法實(shí)例詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09
深入解析Java中的Classloader的運(yùn)行機(jī)制
這篇文章主要介紹了Java中的Classloader的運(yùn)行機(jī)制,包括從JVM方面講解類加載器的委托機(jī)制等,需要的朋友可以參考下2015-11-11

