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

Java中super關(guān)鍵字介紹以及super()的使用

 更新時(shí)間:2022年01月18日 15:07:06   作者:pipizhen_  
這幾天看到類在繼承時(shí)會(huì)用到this和super,這里就做了一點(diǎn)總結(jié),下面這篇文章主要給大家介紹了關(guān)于Java中super關(guān)鍵字介紹以及super()使用的相關(guān)資料,需要的朋友可以參考下

1、super的使用:

(1)super是一個(gè)關(guān)鍵字。

(2)super和this很類似,我們對(duì)比著學(xué)習(xí)。

2、先復(fù)習(xí)一下this關(guān)鍵字的使用。

(1)this能出現(xiàn)在實(shí)例方法和構(gòu)造方法中;

(2)this的語法是“this.”和“this()”;

(3)this不能出現(xiàn)在靜態(tài)方法中;

(4)this大部分情況下是可以省略的;

(5)this.什么時(shí)候不能省略呢?

在區(qū)分局部變量和實(shí)例變量時(shí)不能省略。例如:

Public void setName(String name){
    this.name = name;
}

(6)this()只能出現(xiàn)在構(gòu)造方法的第一行,通過當(dāng)前的構(gòu)造方法去調(diào)用“本類”中的對(duì)應(yīng)的構(gòu)造方法,目的是:代碼復(fù)用。

3、super關(guān)鍵字:

(1)super能出現(xiàn)在實(shí)例方法和構(gòu)造方法中。

(2)super的語法是“super.”和“super()”。

(3) super不能出現(xiàn)在靜態(tài)方法中。

(4) super大部分情況下是可以省略的。

(5)super.什么時(shí)候不能省略呢?
別急,我們想一下this指向的是什么,是當(dāng)前對(duì)象自己。super和this類似,它指向了當(dāng)前對(duì)象自己的父類型特征(也就是繼承過來的那些東西)。

super和this區(qū)別是:this可以看做一個(gè)引用變量,保存了該對(duì)象的地址,是當(dāng)前對(duì)象整體,而super代表的是父類型特征,是子類局部的一些東西,這些繼承過來的東西已經(jīng)在子類里面了,你可以輸出整體this,但不能輸出父類型特征super。因?yàn)閟uper指向的東西不是一個(gè)整體,沒法打印輸出。

System.out.println(this);  //輸出this.toString()的值
System.out.println(super);  //編譯報(bào)錯(cuò),需要'.'

當(dāng)在子類對(duì)象中,子類想訪問父類的東西,可以使用“super.”的方式訪問。例如:方法覆蓋后,子類內(nèi)部雖然重寫了父類的方法,但子類也想使用一下父類的被覆蓋的方法,此時(shí)可以使用“super.”的方式。當(dāng)子類中出現(xiàn)和父類一樣的屬性或者方法,此時(shí),你要想去調(diào)用父類的那個(gè)屬性或者方法,此時(shí)“super.”不能省略。

this和super都只能在對(duì)象內(nèi)部使用。

this代表當(dāng)前對(duì)象本身,super代表當(dāng)前對(duì)象的父類型特征。

總結(jié):“this.”是一個(gè)實(shí)例對(duì)象內(nèi)部為了區(qū)分實(shí)例變量和局部變量。

而“super.”是一個(gè)實(shí)例對(duì)象為了區(qū)分是子類的成員還是父類的成員。

父類有,子類也有,子類想訪問父類的,“super.”不能省略。**

(6)super()只能出現(xiàn)在構(gòu)造方法的第一行,通過當(dāng)前的構(gòu)造方法去調(diào)用“父類”中的對(duì)應(yīng)的構(gòu)造方法,目的是:創(chuàng)建子類對(duì)象時(shí),先初始化父類型特征。

用通俗的話來講,要想有兒子,得先有父親。

我們來看下面代碼:

寫兩個(gè)類,Animal和Cat,Cat繼承Animal。

//父類,Animal類
class Animal {
    //構(gòu)造函數(shù)
    public Animal() {
        System.out.println("Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
    }
}
???????//子類,Cat類
class Cat extends Animal{
    //構(gòu)造函數(shù)
    public Cat() {
        System.out.println("Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
    }
}

執(zhí)行下面一行代碼:

Cat c1 = new Cat(); 

運(yùn)行輸出結(jié)果為:

    Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
    Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行

我們發(fā)現(xiàn)實(shí)例化一個(gè)子類的對(duì)象,也就是調(diào)用了子類的構(gòu)造方法,為什么父類的無參數(shù)構(gòu)造方法也執(zhí)行了,并在子類構(gòu)造方法執(zhí)行之前就已經(jīng)執(zhí)行了父類的無參數(shù)構(gòu)造方法,好奇怪。

剛剛在上面的super關(guān)鍵字的使用第6點(diǎn),我已經(jīng)說了,super()和this()方法一樣,都只能在構(gòu)造方法的第一行出現(xiàn)。我們猜想,難道子類的構(gòu)造方法第一行有一個(gè)隱形的super()方法?答案是肯定的。

我們把子類的構(gòu)造方法的第一行給它加上super():

//子類,Cat類
class Cat extends Animal{
    //構(gòu)造函數(shù)
    public Cat() {
        super();
        System.out.println("Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
    }
}

再執(zhí)行下面代碼:

Cat c1 = new Cat(); 

運(yùn)行輸出結(jié)果為:

    Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
    Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行

和剛才的子類構(gòu)造方法沒加super()是一樣的。

所以說當(dāng)子類的構(gòu)造方法內(nèi)第一行沒有出現(xiàn)“super()”時(shí),系統(tǒng)會(huì)默認(rèn)給它加上無參數(shù)的"super()"方法。

閱讀仔細(xì)的人會(huì)發(fā)現(xiàn),為什么是沒有“this()和super()”就寫上“super()”?有“this()”就不能寫上“super()”嗎?那我問你,當(dāng)構(gòu)造方法第一行有"this()"時(shí),你還能手動(dòng)添加“super()”嗎?顯然不行,因?yàn)?ldquo;this()”也只能出現(xiàn)在第一行,你不能在它前面寫任何代碼。所以我們又得出一個(gè)結(jié)論:構(gòu)造方法中“this()”和“super()”不能同時(shí)出現(xiàn),也就是“this()”和“super()”都只能出現(xiàn)在構(gòu)造方法的第一行。

上面談的都是無參數(shù)的“super”方法,我們也可以在構(gòu)造方法的第一行使用有參數(shù)的“super(父類構(gòu)造函數(shù)的參數(shù)列表)”,但值得注意的是,當(dāng)子類構(gòu)造方法執(zhí)行有參數(shù)的“super(參數(shù)列表)”方法,你得確保父類中也有對(duì)應(yīng)的有參數(shù)構(gòu)造方法,不然會(huì)編譯報(bào)錯(cuò)。同樣我要提醒一下,當(dāng)子類構(gòu)造方法的第一行執(zhí)行super()無參數(shù)方法,那么父類中一定要有無參數(shù)構(gòu)造方法,有的人可能會(huì)在父類中寫了有參數(shù)的構(gòu)造方法,卻忽略了寫無參數(shù)構(gòu)造方法,那么在子類構(gòu)造方法內(nèi)就會(huì)報(bào)錯(cuò),因?yàn)楫?dāng)你在一個(gè)類中寫了有參數(shù)的構(gòu)造方法時(shí),無參數(shù)構(gòu)造方法就會(huì)不存在,你需要自己補(bǔ)上無參數(shù)的構(gòu)造方法,這是一個(gè)良好的編程習(xí)慣。

無論你子類構(gòu)造方法有沒有“this()”和“super()”方法,實(shí)例化子類對(duì)象一定一定會(huì)執(zhí)行對(duì)應(yīng)的父類構(gòu)造方法,即不管實(shí)例化了一個(gè)怎樣的孩子,它一定會(huì)先實(shí)例化一個(gè)對(duì)應(yīng)的父親。

下面給道例題練習(xí)一下this()和super()方法:

public class MyTest {
	
	public static void main(String[] args) {
		new Cat(); 
	}
}

//父類,Animal類
class Animal {
	//構(gòu)造函數(shù)
	public Animal() {
		super();
		System.out.println("1:Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
	}
	public Animal(int i) {
		super();
		System.out.println("2:Animal類的有int參數(shù)構(gòu)造函數(shù)執(zhí)行");
	}
}

//子類,Cat類
class Cat extends Animal{
	//構(gòu)造函數(shù)
	public Cat() {
		this("");
		System.out.println("3:Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
	}
	public Cat(String str) {
		super(5);
		System.out.println("4:Cat類的有String參數(shù)構(gòu)造函數(shù)執(zhí)行");
	}
}

輸出結(jié)果為:

2:Animal類的有int參數(shù)構(gòu)造函數(shù)執(zhí)行
4:Cat類的有String參數(shù)構(gòu)造函數(shù)執(zhí)行
3:Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行

我們又可以得出一個(gè)結(jié)論:不管你創(chuàng)建什么對(duì)象,Object對(duì)象的無參數(shù)構(gòu)造方法一定會(huì)先執(zhí)行,因?yàn)镺bject是所有類的根類。

說了這么多,super()到底什么時(shí)候使用?來看下面代碼:

public class MyTest {
	
	public static void main(String[] args) {
		Cat c1 = new Cat(3); 
		System.out.println("名字:" + c1.getName() + ",年齡:" + c1.getAge());
	}
}

//父類,Animal類
class Animal {
	//私有屬性:名字
	private String name;
	
	//setter and getter
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	
	//構(gòu)造函數(shù)
	public Animal() {
		
	}
	public Animal(String name) {
		this.name = name;
	}
}

//子類,Cat類
class Cat extends Animal{
	//私有字段:年齡
	private int age;
	
	//setter and getter
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	
	//構(gòu)造函數(shù)
	public Cat() {
		
	}
	public Cat(int age) {
		this.age = age;
	}
}

輸出結(jié)果:名字:null,年齡:3

我們也知道,沒有給c1的name賦值嘛,當(dāng)然為默認(rèn)值null啦。

確實(shí)如此,所以我們給Cat加一個(gè)構(gòu)造方法,給name和age都賦值。

如下:

public Cat(String name, int age) {
    this.name = name; //報(bào)錯(cuò)
    this.age = age
}

顯然這樣做是會(huì)報(bào)錯(cuò)的,因?yàn)閚ame已經(jīng)被父類封裝成private的了,不能直接訪問,可能有的人會(huì)這樣做:

public Cat(String name, int age) {
    setName(name);
    this.age = age;
}

顯然這樣做的確可以做到給父類的name賦值,但這樣做是不建議的,我們?cè)跇?gòu)造方法中通常只調(diào)用構(gòu)造方法,不會(huì)去調(diào)用實(shí)例方法,況且當(dāng)不止一個(gè)變量時(shí),用set方法時(shí),我們就要調(diào)用好多個(gè)實(shí)例方法去完成多個(gè)變量的賦值。這時(shí)候?yàn)槭裁床豢紤]使用super()方法呢?如下:

public Cat(String name, int age) {
    super(name);
    this.age = age;
}

這樣就顯得文雅,美觀多了。

總結(jié):

1、this和super一樣,都是對(duì)象內(nèi)部的引用變量,只能出現(xiàn)在對(duì)象內(nèi)部;

2、 this指向當(dāng)前對(duì)象自己,super指向當(dāng)前對(duì)象的父類型特征,故this的東西比super多,也就是super是this的一部分;

3、 this()和super()都只能出現(xiàn)在構(gòu)造方法的第一行,故this()和super()方法不能共存,當(dāng)一個(gè)類的構(gòu)造方法第一行中沒有this(),也沒有super(),系統(tǒng)默認(rèn)有super()方法;

4、this()是構(gòu)造方法中調(diào)用本類其他的構(gòu)造方法,super()是當(dāng)前對(duì)象構(gòu)造方法中去調(diào)用自己父類的構(gòu)造方法。

到此這篇關(guān)于Java中super關(guān)鍵字介紹以及super()使用的文章就介紹到這了,更多相關(guān)Java super關(guān)鍵字使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用

    舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用,裝飾者模式就是給一個(gè)對(duì)象動(dòng)態(tài)的添加新的功能,裝飾者和被裝飾者實(shí)現(xiàn)同一個(gè)接口,裝飾者持有被裝飾者的實(shí)例,需要的朋友可以參考下
    2016-05-05
  • Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用

    Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用

    我們?cè)陂_發(fā)的過程中,經(jīng)常會(huì)遇到分頁(yè)操作,本文主要介紹了Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java通過反射來打印類的方法實(shí)現(xiàn)

    Java通過反射來打印類的方法實(shí)現(xiàn)

    本文主要介紹了Java通過反射來打印類的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 簡(jiǎn)單了解Java日志脫敏框架sensitive

    簡(jiǎn)單了解Java日志脫敏框架sensitive

    這篇文章主要介紹了簡(jiǎn)單了解Java日志脫敏框架sensitive,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring注解之Service用法及示例詳解

    Spring注解之Service用法及示例詳解

    使用 @Service 注解可以將一個(gè)類聲明為業(yè)務(wù)邏輯組件,并將其對(duì)象存入 Spring 容器中,在控制器類中,通過注入該組件的實(shí)例,即可調(diào)用其中的方法,這篇文章主要介紹了Spring注解之Service用法及示例詳解,需要的朋友可以參考下
    2024-04-04
  • 淺談Java并發(fā)編程之Lock鎖和條件變量

    淺談Java并發(fā)編程之Lock鎖和條件變量

    這篇文章主要介紹了淺談Java并發(fā)編程之Lock鎖和條件變量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 優(yōu)化Java內(nèi)存管理來防止“GC”錯(cuò)誤的方法詳解

    優(yōu)化Java內(nèi)存管理來防止“GC”錯(cuò)誤的方法詳解

    垃圾回收(GC)是 Java 中的一個(gè)重要機(jī)制,它可以管理內(nèi)存并回收不再使用的對(duì)象所占用的資源,在本文中,我們將探討一些技巧,幫助您避免這一錯(cuò)誤,確保您的 Java 應(yīng)用程序順利運(yùn)行,需要的朋友可以參考下
    2023-11-11
  • 詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理

    詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • SpringCloud  OpenFeign 參數(shù)傳遞和響應(yīng)處理的詳細(xì)步驟

    SpringCloud  OpenFeign 參數(shù)傳遞和響應(yīng)處理的詳細(xì)步驟

    本文給大家講解SpringCloud  OpenFeign 參數(shù)傳遞和響應(yīng)處理的詳細(xì)步驟,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-02-02
  • 詳解Java并發(fā)包中線程池ThreadPoolExecutor

    詳解Java并發(fā)包中線程池ThreadPoolExecutor

    ThreadPoolExecutor是Java語言對(duì)于線程池的實(shí)現(xiàn)。線程池技術(shù)使線程在使用完畢后不回收而是重復(fù)利用。如果線程能夠復(fù)用,那么我們就可以使用固定數(shù)量的線程來解決并發(fā)問題,這樣一來不僅節(jié)約了系統(tǒng)資源,而且也會(huì)減少線程上下文切換的開銷
    2021-06-06

最新評(píng)論

饶阳县| 洛阳市| 杂多县| 农安县| 宁夏| 安泽县| 青海省| 堆龙德庆县| 仙居县| 德江县| 和林格尔县| 丹棱县| 永年县| 宽城| 东港市| 桐城市| 泽州县| 多伦县| 墨脱县| 噶尔县| 墨竹工卡县| 株洲市| 绍兴市| 苗栗市| 丹凤县| 始兴县| 长兴县| 锡林郭勒盟| 元阳县| 横峰县| 宣化县| 无棣县| 交口县| 封开县| 凤翔县| 晋江市| 广河县| 新建县| 湖北省| 边坝县| 扶余县|