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

Java中的this和super實(shí)例淺析

 更新時(shí)間:2017年03月01日 11:37:09   作者:五道杠大隊(duì)長(zhǎng)  
要說this和super就不得不說Java的封裝和繼承了。這篇文章主要介紹了Java中的this和super實(shí)例淺析,需要的朋友可以參考下

要說this和super就不得不說Java的封裝和繼承了,首先說封裝,這是一種思想,算不上一種技術(shù),核心思想就是將對(duì)象的同一行為和狀態(tài)看成是一個(gè)整體,將無需對(duì)外界暴露的屬性和方法隱藏起來,比如一些方法的具體實(shí)現(xiàn)和一些私有的變量,通過公共的方法提供對(duì)屬性的操作,從而提高安全性。

class Person {
 private String name = "無名氏";//私有的內(nèi)部成員變量
 private int age = 20;//私有的內(nèi)部成員變量
 public void sayHello(){//公有的方法,外界可以通過調(diào)用這個(gè)方法獲得需要的功能
  System.out.println("我的名字是"+name+",今年"+age+"了");
 }
 public String getName() {//公有的方法,外界通過操作這個(gè)方法獲取私有變量值
  return name;
 }
 public void setName(String name) {//公有方法,外界通過操作這個(gè)方法設(shè)置公有變量的值
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
}

然而這種封裝也不是絕對(duì)的,當(dāng)我們需要一些很相似的類的時(shí)候,往往希望能夠通過一個(gè)類派生出許多的擁有共同的特性的類,比如通過動(dòng)物這個(gè)類,派生出貓狗雞鴨這些類,他們都擁有動(dòng)物的特性,但是又各有特點(diǎn)。這就是Java中的繼承,通過繼承,我們可以獲得父類所暴露給子類的所有成員,而又可以在父類的基礎(chǔ)上構(gòu)建自己特有的屬性。

public class StaticDemo {
 public static void main(String[] args) {
  Student s = new Student();
  s.age = 20;//從父類繼承的屬性
  s.name = "張同學(xué)";
  s.stuNumber = 10;//子類特有的成員變量
  s.sayHello();//從父類繼承的方法
  s.study();
 }
}
class Person {
 protected String name = "無名氏";// 子類共享的成員變量
 protected int age = 20;// 子類共享的成員變量
 public void sayHello() {// 公有的方法,外界可以通過調(diào)用這個(gè)方法獲得需要的功能
  System.out.println("我的名字是" + name + ",今年" + age + "了");
 }
}
class Student extends Person {
 public int stuNumber = 20;// 學(xué)生特有的學(xué)號(hào)
 public void study() {// 學(xué)生特有的方法,學(xué)習(xí)
  System.out.println("好好學(xué)習(xí)!");
 }
}

至此,我們已經(jīng)大概了解封裝和繼承,那下面就來看看this和super關(guān)鍵字是什么意思。
super關(guān)鍵字代表的是父類對(duì)象,this關(guān)鍵字代表的是當(dāng)前對(duì)象。要理解這些,首先我們要看看子類在創(chuàng)建對(duì)象的時(shí)候執(zhí)行了什么。為了方便起見,在此都使用無參構(gòu)造方法。

編譯器找到子類無參構(gòu)造方法。

執(zhí)行子類無參構(gòu)造方法。

在子類無參構(gòu)造方法的方法體中,第一句代碼是隱藏得super();這句代碼的意思是執(zhí)行父類構(gòu)造方法。

跳轉(zhuǎn)到父類構(gòu)造方法中,執(zhí)行父類構(gòu)造方法,注意,此時(shí)子類構(gòu)造方法并未執(zhí)行完畢,并且若父類還有父類,則一直執(zhí)行上一層父類的構(gòu)造方法,直到找到所有類的祖宗Object類。

將父類的對(duì)象的引用存入子類的super中,即子類中的super代表的是父類實(shí)體。然而在父類中,super代表的又是父類的父類的實(shí)體。

將創(chuàng)建出的當(dāng)前類的引用存入this。

public class StaticDemo {
 public static void main(String[] args) {
  GirlStudent g = new GirlStudent();
  g.sayName();
 }
}
class Person {
 protected String name = "無名氏";// 子類共享的成員變量
 protected int age = 20;// 子類共享的成員變量
 public void sayHello() {// 公有的方法,外界可以通過調(diào)用這個(gè)方法獲得需要的功能
  System.out.println("我的名字是" + name + ",今年" + age + "了");
 }
}
class Student extends Person {
 public int stuNumber = 20;// 學(xué)生特有的學(xué)號(hào)
 public String name = "張同學(xué)";
 public String getSuperName() {//獲取當(dāng)前類的父類名字的方法,對(duì)于student是父類,對(duì)于girlstudent則是爺爺類
  return super.name;//父類中的super代表的是父類的父類,即student的父類即person類,可以看出子類一旦初始化,將會(huì)創(chuàng)建出所有父類對(duì)象,一直到object
 }
}
class GirlStudent extends Student{
 public String name = "小紅";
 public void sayName(){
  System.out.println("自己的名字是:"+this.name+",父類的名字是:"+super.name+",爺爺類的名字是:"+super.getSuperName());
 }
}

由此可以看出super的用途:用于調(diào)用子類隱藏的父類的屬性,比如上述代碼中的name屬性,還有一個(gè)比較重要的用途就是用于調(diào)用被子類覆寫的方法,此時(shí)方法名相同,必須使用super才能調(diào)用父類的方法。
this的用途:在變量定義不明確時(shí),用來確定調(diào)用的具體是哪個(gè)變量。

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

在上面的代碼中由于傳入的變量也是name,類中本來就存在一個(gè)變量也叫name,此時(shí)將不明確name是哪個(gè),所以使用this進(jìn)行區(qū)分。

PS:super和this的異同:

super(參數(shù)):調(diào)用基類中的某一個(gè)構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)

this(參數(shù)):調(diào)用本類中另一種形成的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)

super: 它引用當(dāng)前對(duì)象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數(shù)據(jù)或函數(shù),基類與派生類中有相同成員定義時(shí)如:super.變量名    super.成員函數(shù)據(jù)名(實(shí)參)

this:它代表當(dāng)前對(duì)象名(在程序中易產(chǎn)生二義性之處,應(yīng)使用this來指明當(dāng)前對(duì)象;如果函數(shù)的形參與類中的成員數(shù)據(jù)同名,這時(shí)需用this來指明成員變量名)

調(diào)用super()必須寫在子類構(gòu)造方法的第一行,否則編譯不通過。每個(gè)子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。

super()和this()類似,區(qū)別是,super()從子類中調(diào)用父類的構(gòu)造方法,this()在同一類內(nèi)調(diào)用其它方法。

super()和this()均需放在構(gòu)造方法內(nèi)第一行。

盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè)。

this和super不能同時(shí)出現(xiàn)在一個(gè)構(gòu)造函數(shù)里面,因?yàn)閠his必然會(huì)調(diào)用其它的構(gòu)造函數(shù),其它的構(gòu)造函數(shù)必然也會(huì)有super語句的存在,所以在同一個(gè)構(gòu)造函數(shù)里面有相同的語句,就失去了語句的意義,編譯器也不會(huì)通過。

this()和super()都指的是對(duì)象,所以,均不可以在static環(huán)境中使用。包括:static變量,static方法,static語句塊。

從本質(zhì)上講,this是一個(gè)指向本對(duì)象的指針, 然而super是一個(gè)Java關(guān)鍵字。

相關(guān)文章

  • 詳細(xì)學(xué)習(xí)Java Cookie技術(shù)(用戶登錄、瀏覽、訪問權(quán)限)

    詳細(xì)學(xué)習(xí)Java Cookie技術(shù)(用戶登錄、瀏覽、訪問權(quán)限)

    這篇文章主要為大家詳細(xì)介紹了Java Cookie技術(shù),顯示用戶上次登錄的時(shí)間、顯示用戶最近瀏覽的若干個(gè)圖片(按比例縮放)等,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring使用AspectJ的注解式實(shí)現(xiàn)AOP面向切面編程

    Spring使用AspectJ的注解式實(shí)現(xiàn)AOP面向切面編程

    這篇文章主要介紹了Spring使用AspectJ的注解式實(shí)現(xiàn)AOP面向切面編程的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring Cloud Config實(shí)現(xiàn)分布式配置中心

    Spring Cloud Config實(shí)現(xiàn)分布式配置中心

    這篇文章主要介紹了Spring Cloud Config實(shí)現(xiàn)分布式配置中心,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • SpringBoot多表聯(lián)查(測(cè)試可用)

    SpringBoot多表聯(lián)查(測(cè)試可用)

    這篇文章主要介紹了SpringBoot多表聯(lián)查(測(cè)試可用)的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • idea顯示properties文件中文亂碼的解決方法

    idea顯示properties文件中文亂碼的解決方法

    在項(xiàng)目中通常會(huì)遇到如下問題,突然properties文件中文亂碼,本文主要介紹了idea顯示properties文件中文亂碼的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Junit Mockito實(shí)現(xiàn)單元測(cè)試方法介紹

    Junit Mockito實(shí)現(xiàn)單元測(cè)試方法介紹

    JUnit是用于編寫和運(yùn)行可重復(fù)的自動(dòng)化測(cè)試開源測(cè)試項(xiàng)目框架,這樣可以保證我們的代碼按與其工作。JUnit可廣泛用于工業(yè)和作為支架(從命令行)或IDE(如IDE)內(nèi)單獨(dú)的java程序
    2022-09-09
  • 聊聊@value注解和@ConfigurationProperties注解的使用

    聊聊@value注解和@ConfigurationProperties注解的使用

    這篇文章主要介紹了@value注解和@ConfigurationProperties注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 關(guān)于BigDecimal類型之間比較問題

    關(guān)于BigDecimal類型之間比較問題

    這篇文章主要介紹了關(guān)于BigDecimal類型之間比較問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java8 CompletableFuture異步編程解讀

    Java8 CompletableFuture異步編程解讀

    Java8引入的CompletableFuture是Java異步編程的重要進(jìn)展,提供了基于未來結(jié)果的異步編程模型,它適用于異步計(jì)算、多個(gè)并行任務(wù)組合、異步回調(diào)、超時(shí)控制、錯(cuò)誤處理和多任務(wù)組合與合成等場(chǎng)景
    2024-12-12
  • 還在用if(obj!=null)做非空判斷,帶你快速上手Optional

    還在用if(obj!=null)做非空判斷,帶你快速上手Optional

    這篇文章主要介紹了還在用if(obj!=null)做非空判斷,帶你快速上手Optional,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05

最新評(píng)論

名山县| 东至县| 山西省| 漠河县| 建宁县| 宁阳县| 寿宁县| 密山市| 五常市| 吉安县| 莱西市| 石城县| 漳平市| 武宁县| 焦作市| 依安县| 托里县| 八宿县| 湖北省| 寿阳县| 洛南县| 五华县| 四子王旗| 望都县| 武山县| 兴仁县| 合江县| 龙江县| 麻城市| 于田县| 平湖市| 美姑县| 赤城县| 吉水县| 丘北县| 广昌县| 璧山县| 崇信县| 巴林左旗| 夏邑县| 弥渡县|