最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?super、this、static關(guān)鍵字實(shí)踐案例

 更新時間:2025年11月03日 09:42:04   作者:美味蛋炒飯.  
本文詳細(xì)介紹了Java繼承的概念,包括繼承的本質(zhì)、創(chuàng)建子類對象的過程、方法重寫和方法重載的區(qū)別,以及Java的繼承層次,此外,還討論了super和this關(guān)鍵字的用法,以及static關(guān)鍵字的歸屬、內(nèi)存模型、靜態(tài)方法的調(diào)用限制和靜態(tài)代碼塊的執(zhí)行時機(jī),感興趣的朋友一起看看吧

一.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)建子類對象(如CatDog)時,會先創(chuàng)建父類Animal的對象(堆中0x1標(biāo)識的區(qū)域,包含父類的name、colorrun()、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是頂層父類,CatDog都直接繼承自Animal(體現(xiàn) “一個父類可以有多個子類”)。
  • Dog作為父類,又有小黑狗類、小黃狗類、小白狗類三個子類。
  • 圖中 “不允許” 的箭頭表示:小黑狗類不能同時繼承CatDog,因?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í)行 mainrun 等方法時的局部變量在此分配。
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)文章

最新評論

德昌县| 甘谷县| 庆城县| 广饶县| 香港 | 罗甸县| 太仆寺旗| 陇西县| 布拖县| 夹江县| 抚州市| 宜春市| 林口县| 道真| 临邑县| 新巴尔虎右旗| 凤冈县| 通化市| 锦屏县| 扎兰屯市| 张家川| 永福县| 闽侯县| 垣曲县| 蚌埠市| 阿瓦提县| 章丘市| 宁海县| 渝北区| 石林| 淮南市| 梅州市| 于田县| 赤城县| 堆龙德庆县| 湖州市| 赫章县| 阿拉尔市| 太康县| 岢岚县| 山丹县|