大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java繼承多個(gè)類的例子

Java繼承多個(gè)類的例子

更新時(shí)間:2022-04-29 10:00:44 來源:動(dòng)力節(jié)點(diǎn) 瀏覽3209次

java多個(gè)類繼承的方法有哪些?動(dòng)力節(jié)點(diǎn)小編來給大家舉例說明。

假設(shè)有三個(gè)java類,ClassA-ClassB-ClassC,ClassC在最底端。先看例子:

public class ClassA {undefined
public void fun1(){undefined
System.out.println(“A-fun1″);
}
public void fun2(){undefined
System.out.println(“A-fun2″);
}
public void fun3(){undefined
System.out.println(“A-fun3″);
}
public ClassA(){undefined
System.out.println(“A-ClassA”);
}
}
public class ClassB extends ClassA{undefined
public void fun1(){undefined
System.out.println(“B-fun1″);
}
public ClassB(){undefined
System.out.println(“B-ClassB”);
}
public ClassB(String str){undefined
System.out.println(“B-ClassB(String)”);
}
}
public class ClassC extends ClassB{undefined
public void fun1(){undefined
System.out.println(“C-fun1″);
}
public void fun2(){undefined
System.out.println(“C-fun2″);
System.out.println(“————-super.fun1()前————————”);
super.fun1();
System.out.println(“—————-super.fun1()后———————”);
}
public ClassC(){undefined
super(“aaa”);
System.out.println(“C-ClassC”);
}
public static void main(String[] agrs){undefined
ClassA c1 = new ClassC();
c1.fun1();
c1.fun2();
c1.fun3();
System.out.println(“————————————-”);
ClassB c2 = new ClassC();
c1.fun2();
c2.fun1();
}
}

輸出:

A-ClassA
B-ClassB(String)
C-ClassC
C-fun1
C-fun2
————-super.fun1()前————————
B-fun1
—————-super.fun1()后———————
A-fun3
————————————-
A-ClassA
B-ClassB(String)
C-ClassC
C-fun2
————-super.fun1()前————————
B-fun1
—————-super.fun1()后———————
C-fun1

c1這個(gè)對象,執(zhí)行時(shí)的類型是ClassC。

首先說構(gòu)造方法。如果不寫super(),相當(dāng)于默認(rèn)寫了個(gè)super(),如果new ClassC()會從最頂端的類開始初始化,依次調(diào)用

A-ClassA()

B-ClassB()

C-ClassC()

而此處,我們在ClassC中寫了個(gè)

super(“aaa”);

就會去調(diào)用B中的帶參數(shù)的構(gòu)造方法,而不再調(diào)用無參的構(gòu)造方法。所以,當(dāng)new ClassC()時(shí),

我們得到的結(jié)果是:

A-ClassA

B-ClassB(String)

C-ClassC

特別要注意的是,super()只能在構(gòu)造方法中使用,而且只能在第一行使用。this()也是同樣的道理。

而我們在C的fun2()中調(diào)用了super.fun1();

則再一次調(diào)用了C的父類,也就是B的fun1(),輸出一個(gè)B-fun1。

再來說三個(gè)方法的覆蓋問題。

B覆蓋了fun1(),C覆蓋了fun1(),fun2()

也就是說,雖然B中沒有fun2(),而且C繼承了B,但C同樣可以覆蓋fun2()。

說明了,凡是整個(gè)繼承系統(tǒng)中有的方法,無論上一級類是否有,都可以覆蓋。

按照這種寫法

ClassA c1 = new ClassC();

B類中的方法,如果不是C類用了super.fun1(),是絕不可能調(diào)用到的。

也就是,如果不在C類的fun2()中寫super.fun1(),輸出結(jié)果應(yīng)該是:

A-ClassA
B-ClassB(String)
C-ClassC
C-fun1
C-fun2
A-fun3
————————————-
A-ClassA
B-ClassB(String)
C-ClassC
C-fun2
C-fun1

而從ClassB c2 = new ClassC()來看,也不可能調(diào)用到C類中的方法,因?yàn)閳?zhí)行時(shí)的類型為C。

下面再看一個(gè)例子:

public class Class1 {undefined
int a = 1;
static int b = 2;
private int i = 1;
int j = 4;
{undefined
System.out.println(“normal—Class1–(a==”+a+”)–(b==”+b+”)”);
}
static{undefined
//System.out.println(“static—MClass1–”+a+”–”+b);//這里不認(rèn)識非靜態(tài)變量
System.out.println(“static—Class1–(b==”+b+”)”);
}
public Class1(){undefined
System.out.println(“construct—Class1–(a==”+a+”)—(b==”+b+”)”);
System.out.println(“fun1—Class1–(this.i==”+this.i+”)”);
System.out.println(“fun1—Class1–(this.j==”+this.j+”)”);
this.fun1();
}
public void fun1(){undefined
System.out.println(“fun1—Class1–(i==”+i+”)”);
System.out.println(“fun1—Class1–(j==”+j+”)”);
}
}
public class Class2 extends Class1{undefined
int c = 1;
static int d = 2;
{undefined
System.out.println(“normal—Class2–(a==”+a+”)–(b==”+b+”)”);
System.out.println(“normal—Class2–(c==”+c+”)–(d==”+d+”)”);
}
static{undefined
//System.out.println(“static—MClass1–”+a+”–”+b);//這里不能調(diào)用非靜態(tài)變量
System.out.println(“static—Class2–(b==”+b+”)”);
System.out.println(“static—Class2–(d==”+d+”)”);
}
public Class2(){undefined
System.out.println(“construct—Class2–(a==”+a+”)—(b==”+b+”)”);
System.out.println(“construct—Class2–(c==”+c+”)—(d==”+d+”)”);
}
}
public class Class3 extends Class2{undefined
int e = 1;
static int f = 2;
private int i = 2;
int j = 3;
{undefined
System.out.println(“normal—Class3–(a==”+a+”)–(b==”+b+”)”);
System.out.println(“normal—Class3–(c==”+c+”)–(d==”+d+”)”);
System.out.println(“normal—Class3–(e==”+e+”)–(f==”+f+”)”);
}
static{undefined
//System.out.println(“static—MClass1–”+a+”–”+b);//這里不能調(diào)用非靜態(tài)變量
System.out.println(“static—Class3–(b==”+b+”)”);
System.out.println(“static—Class3–(d==”+d+”)”);
System.out.println(“static—Class3–(f==”+f+”)”);
}
public Class3(){undefined
System.out.println(“construct—Class3–(a==”+a+”)—(b==”+b+”)”);
System.out.println(“construct—Class3–(c==”+c+”)—(d==”+d+”)”);
System.out.println(“construct—Class3–(e==”+e+”)—(f==”+f+”)”);
i=222;
j=333;
}
public void fun1(){undefined
System.out.println(“fun1—Class3–(i==”+i+”)”);
System.out.println(“fun1—Class3–(j==”+j+”)”);
}
public static void main(String[] agrs){undefined
new Class3();
}
}

輸出結(jié)果:

static—Class1–(b==2)
static—Class2–(b==2)
static—Class2–(d==2)
static—Class3–(b==2)
static—Class3–(d==2)
static—Class3–(f==2)
normal—Class1–(a==1)–(b==2)
construct—Class1–(a==1)—(b==2)
fun1—Class1–(this.i==1)
fun1—Class1–(this.j==4)
fun1—Class3–(i==0)
fun1—Class3–(j==0)
normal—Class2–(a==1)–(b==2)
normal—Class2–(c==1)–(d==2)
construct—Class2–(a==1)—(b==2)
construct—Class2–(c==1)—(d==2)
normal—Class3–(a==1)–(b==2)
normal—Class3–(c==1)–(d==2)
normal—Class3–(e==1)–(f==2)
construct—Class3–(a==1)—(b==2)
construct—Class3–(c==1)—(d==2)
construct—Class3–(e==1)—(f==2)

這里有兩個(gè)知識點(diǎn)要說明:

1.類的初始化順序是:

(靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構(gòu)造器

而根據(jù)上面的輸出結(jié)果看出,三個(gè)類的靜態(tài)初始化塊執(zhí)行完了,再依次是:

Class1的非靜態(tài)初始化塊

Class1的構(gòu)造器

Class2的非靜態(tài)初始化塊

Class2的構(gòu)造器

Class3的非靜態(tài)初始化塊

Class3的構(gòu)造器

值得注意的是,靜態(tài)的方法和初始化塊中都不能直接調(diào)用非靜態(tài)變量!

2.寫了一個(gè)小插曲,如果Class1中的fun1()被Class2中的fun1()覆蓋,當(dāng)Class1初始化(也就是調(diào)用Class1的構(gòu)造器)時(shí),

在Class1的構(gòu)造器中調(diào)用this.fun1();會調(diào)到誰的?

兩個(gè)類都有兩個(gè)變量i、j,其中i是private

在Class1的構(gòu)造器中調(diào)用this.i和this.j又會調(diào)到誰的?

記住一點(diǎn),如果是調(diào)用方法,就看執(zhí)行時(shí)的類型,如果是調(diào)用變量,就看編譯時(shí)的類型。

所以說,fun1()會調(diào)用到 Class3的,而i、j會調(diào)用到Class1的。

又由于,所有的變量和方法都會最先在內(nèi)存中開辟空間,變量初始值默認(rèn)為0或null,

例如定義了int i=3 相當(dāng)于寫了先int i=0后面再寫i=3;

當(dāng)Class1初始化時(shí),Class3并沒有完成初始化,僅完在了int i=0這個(gè)步驟。

所以,在Class1初始化時(shí)調(diào)用Class3的fun1()輸出Class3的i和j的值均為0。

而在Class1的構(gòu)造器中輸出i和j是屬于Class1的,在執(zhí)行構(gòu)造器前就已經(jīng)完成了賦值

其實(shí),這兒不寫this效果是一樣的。

以上就是關(guān)于“Java繼承多個(gè)類的例子”介紹,大家如果對此比較感興趣,想了解更多相關(guān)知識,不妨來關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java教程,里面的課程內(nèi)容細(xì)致全面,通俗易懂,很適合小白學(xué)習(xí),希望對大家的學(xué)習(xí)能夠有所幫助哦。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 午夜a一级毛片一.成 | 亚洲国产精品成 | 日韩欧美天堂 | 亚洲国产一区二区三区在线观看 | 久热国产精品 | 美国免费三片在线观看 | 一级韩国aa毛片免费观看 | 97视频免费在线观看 | 亚洲视频国产 | 国产成人视屏 | 国产福利不卡视频在免费播放 | 国产成人 免费观看 | 久久国产精品99久久久久久牛牛 | 中文字幕免费观看视频 | 最新国产精品自拍 | 呦系列视频一区二区三区 | 国产福利资源 | 四虎亚洲精品 | 91精品日韩 | 日韩一级精品视频在线观看 | 一区二区在线视频 | 亚洲我射| 久久爱综合网 | 99视频九九精品视频在线观看 | 日本大胆一区免费视频 | 天天撸天天操 | 国产精品视频在线播放 | 久久9966e这里只有精品 | 亚洲国产成人久久99精品 | 国产一区免费在线观看 | 亚洲欧美国产毛片在线 | 四虎免费最新在线永久 | 天天久久狠狠伊人第一麻豆 | 97影院理论片在线观看 | 国产成a人片在线观看视频99 | 久久www免费人成看片色多多 | 久久亚洲精品永久网站 | 四虎官方影库 | 色综合久久一区二区三区 | 日本狠狠干 | 欧美成人性视频播放 |