欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于java關(guān)鍵字this和super的區(qū)別和理解

 更新時(shí)間:2021年01月31日 16:22:55   作者:智歐巴  
這篇文章主要給大家介紹了關(guān)于java關(guān)鍵字this和super的區(qū)別和理解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

this:

this理解為:當(dāng)前對(duì)象 或 當(dāng)前正在創(chuàng)建的對(duì)象

可以調(diào)用的結(jié)構(gòu):屬性、方法;構(gòu)造器

this調(diào)用屬性、方法:

先了解一下形參:

形參的意義就是給屬性賦值,我們是要給同名的屬性賦值,這時(shí)候我們就把形參名和屬性的名字寫(xiě)成一樣,這樣我們就知道我們傳入的形參就是要給我們同名的屬性去賦值的.

在類(lèi)的方法中,我們可以使用"this.屬性"或"this.方法"的方式,調(diào)用當(dāng)前對(duì)象屬性或方法。但是,

通常情況下,我們都擇省略"this."。特殊情況下,如果方法的形參和類(lèi)的屬性同名時(shí),我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。

舉例:我們聲明一個(gè)類(lèi)叫鞋類(lèi),給它提供私有的屬性和get/set方法和構(gòu)造器:

//聲明一個(gè)鞋類(lèi)
public class shoes {
 //鞋的屬性
 private String name;//鞋名
 private int id;//編號(hào)

 
 //無(wú)參構(gòu)造器
 public shoes() {
 }

 //有參構(gòu)造器:
 public shoes(String name, int id) {
//  name = name;沒(méi)加this
  this.name = name;
//  id = id; 沒(méi)加this
  this.id = id;
 }
 
 
 //聲明兩個(gè)方法
 public void show(){
  System.out.println("展示~~");
  sale();//show方法中調(diào)sale方法
//  this.sale();//this可省略
 }
 public void sale(){
  System.out.println("售賣(mài)~~");
 }

 
 //get/set方法:
 public String getName() {
  return name;
 }
 public void setName(String name) {
  //name = name;沒(méi)加this
  this.name = name;
 }
 public void setId(int id) {
  //id = id;沒(méi)加this
  this.id = id;
 }
 public int getId() {
  return id;
 }
}

//測(cè)試
class test {
 public static void main(String[] args) {
  //我們先實(shí)例化鞋類(lèi)的對(duì)象來(lái)調(diào)它的屬性
  shoes s = new shoes();
  s.setName("nike");//這里的"nike"就是傳入的形參
  System.out.println(s.getName());
  //我們獲取鞋名的時(shí)候,獲取不到,意思就是形參的值又賦給了形參,代表沒(méi)有給鞋的屬性賦上值
  //這個(gè)時(shí)候控制臺(tái)會(huì)輸出傳入的形參數(shù)據(jù)類(lèi)型的默認(rèn)值,明顯不是我們想看到的結(jié)果
  s.setId(1);
  System.out.println(s.getId());//鞋的id類(lèi)似的也會(huì)出現(xiàn)同樣的情況
  
  
  //"this.方法"舉例:
  s.show();
  /*我們先調(diào)的是show自己的方法體,然后在show方法中調(diào)了sale方法
  意思是s這個(gè)對(duì)象調(diào)了show方法,我們就用調(diào)show方法的這個(gè)對(duì)象s來(lái)調(diào)sale方法,
  其實(shí)在sale();前面也省略了this關(guān)鍵字,表示當(dāng)前對(duì)象(就是調(diào)show方法的對(duì)象)調(diào)的sale方法*/
  
  
System.out.println("------------------------分割線(xiàn)--------------------");
  
  
  shoes s1 = new shoes("李寧",2);//我們new的有參數(shù)的對(duì)象給它賦初值之后
  System.out.println(s1.getName());
  System.out.println(s1.getId());//如果沒(méi)有加this,結(jié)果還是和沒(méi)有獲取到鞋名和編號(hào)
 }
}

先來(lái)看沒(méi)有加this關(guān)鍵字的情況:

在這里插入圖片描述

結(jié)果:

在這里插入圖片描述

然后我們給鞋屬性加上this關(guān)鍵字:

在這里插入圖片描述

控制臺(tái)輸出的就是我們給鞋設(shè)置的名字和編號(hào):

在這里插入圖片描述

在類(lèi)的構(gòu)造器中,我們可以使用"this.屬性"或"this.方法"的方式,調(diào)用當(dāng)前正在創(chuàng)建的對(duì)象屬性或方法。但是,通常情況下,我們都擇省略"this."。特殊情況下,如果構(gòu)造器的形參和類(lèi)的屬性同名時(shí),我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。

同樣的我們的構(gòu)造器也是一樣:如果有參構(gòu)造器沒(méi)有加給屬性加this關(guān)鍵字:控制臺(tái)輸出結(jié)果也和上面一樣

在這里插入圖片描述

加上之后:

在這里插入圖片描述

"this.方法"舉例:我們聲明兩個(gè)方法show和sale方法來(lái)舉例體會(huì)一下this的作用:代碼參照上面:

s.show();的結(jié)果:

在這里插入圖片描述

this調(diào)用構(gòu)造器:

① 我們?cè)陬?lèi)的構(gòu)造器中,可以顯式的使用"this(形參列表)"方式,調(diào)用本類(lèi)中指定的其他構(gòu)造器

② 構(gòu)造器中不能通過(guò)"this(形參列表)“方式調(diào)用自己

③ 如果一個(gè)類(lèi)中有n個(gè)構(gòu)造器,則最多有 n - 1構(gòu)造器中使用了"this(形參列表)”

④ 規(guī)定:"this(形參列表)“必須聲明在當(dāng)前構(gòu)造器的首行

⑤ 構(gòu)造器內(nèi)部,最多只能聲明一個(gè)"this(形參列表)”,用來(lái)調(diào)用其他的構(gòu)造器

舉例:我們還是寫(xiě)一個(gè)Shoes類(lèi) 提供私有屬性和get/set方法并提供三個(gè)構(gòu)造器:

public class Shoes {

 //屬性
 private String name;//鞋名
 private int id;//編號(hào)

 //get/set方法:
 public String getName() {
  return name;
 }

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

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 //構(gòu)造器1
 public Shoes() {
  System.out.println("構(gòu)造器1");
 }
 
 //構(gòu)造器2
 public Shoes(int id){
  this();//調(diào)構(gòu)造器1
  System.out.println("構(gòu)造器2");
  this.id = id;
 }

 //構(gòu)造器3
 public Shoes(String name, int id) {
  //通過(guò)調(diào)用構(gòu)造器來(lái)執(zhí)行其他構(gòu)造器中的代碼
  this(id);//調(diào)構(gòu)造器2
//  this.id = id;//交給構(gòu)造器2來(lái)執(zhí)行
  this.name = name;

  //我們?nèi)绻枰褂玫狡渌麡?gòu)造器中的代碼就可以使用"this.構(gòu)造器"的方式
  //這里只是為了舉例我們只寫(xiě)了一行輸出語(yǔ)句,真正實(shí)際中我們寫(xiě)的代碼多了,調(diào)用構(gòu)造器的方法的優(yōu)勢(shì)就體現(xiàn)出來(lái)了
  //這樣我們可以減少代碼的冗余,提高程序執(zhí)行效率
 }
}
class test{
 public static void main(String[] args) {

  //用構(gòu)造器3來(lái)實(shí)例化對(duì)象,我們?cè)跇?gòu)造器3中沒(méi)有把參數(shù)id賦給當(dāng)前對(duì)象
  //但是通過(guò)調(diào)構(gòu)造器2,構(gòu)造器2中執(zhí)行了 this.id = id;把id賦給了當(dāng)前對(duì)象的屬性
  //所以我們才可以得到當(dāng)前對(duì)象s3的id
  Shoes s3 = new Shoes("adidas",2021);
  System.out.println(s3.getId());
 }
}

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

在這里插入圖片描述

super:

super 關(guān)鍵字可以理解為:父類(lèi)的

可以用來(lái)調(diào)用的結(jié)構(gòu):

屬性、方法、構(gòu)造器

super調(diào)用屬性、方法:

我們可以在子類(lèi)的方法或構(gòu)造器中。通過(guò)使用"super.屬性"或"super.方法"的方式,顯式的調(diào)用父類(lèi)中聲明的屬性或方法。但是,通常情況下,我們習(xí)慣省略"super."

①特殊情況:當(dāng)子類(lèi)和父類(lèi)中定義了同名的屬性時(shí),我們要想在子類(lèi)中調(diào)用父類(lèi)中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調(diào)用的是父類(lèi)中聲明的屬性。

② 特殊情況:當(dāng)子類(lèi)重寫(xiě)了父類(lèi)中的方法以后,我們想在子類(lèi)的方法中調(diào)用父類(lèi)中被重寫(xiě)的方法時(shí),則必須顯式的使用"super.方法"的方式,表明調(diào)用的是父類(lèi)中被重寫(xiě)的方法(也就是父類(lèi)中原本的方法)。

舉例兩種特殊情況:在子類(lèi)的方法中調(diào)用父類(lèi)中同名的屬性和方法:

創(chuàng)建一個(gè)人類(lèi),一個(gè)學(xué)生類(lèi),學(xué)生類(lèi)繼承人類(lèi),和一個(gè)測(cè)試類(lèi)

//人類(lèi)
public class Person {

 //屬性
 String name = "普通人";//姓名
 int id = 1234;//身份證號(hào)

 //方法
 public void learn(){
  System.out.println("人要學(xué)習(xí)");
 }
}
//學(xué)生類(lèi)
public class Student extends Person {

 //聲明了與父類(lèi)的同名屬性
 String name = "哈利波特";//姓名
 int id = 9527;//學(xué)號(hào)


 @Override//子類(lèi)重寫(xiě)父類(lèi)的方法
 public void learn() {

  System.out.println("學(xué)生要努力學(xué)習(xí)");
  super.learn();//調(diào)父類(lèi)中原本的方法
  System.out.println("姓名:"+name);//子類(lèi)自己的屬性
  System.out.println("學(xué)號(hào):"+id);
  System.out.println("姓名:"+super.name);//父類(lèi)中聲明的屬性
  System.out.println("身份證號(hào):"+super.id);
 }
}
//測(cè)試類(lèi)
public class Test {
 public static void main(String[] args) {
  //實(shí)例化子類(lèi)對(duì)象
  Student student = new Student();
  //調(diào)子類(lèi)中重寫(xiě)父類(lèi)的方法
  student.learn();
 }
}

輸出結(jié)果:

在這里插入圖片描述

super調(diào)用構(gòu)造器:

我們可以在子類(lèi)的構(gòu)造器中顯式的使用"super(形參列表)"的方式,調(diào)用父類(lèi)中聲明的指定的構(gòu)造器

注意:

"super(形參列表)"的使用,必須聲明在子類(lèi)構(gòu)造器的首行!我們?cè)陬?lèi)的構(gòu)造器中,針對(duì)于"this(形參列表)"或"super(形參列表)"只能二者取其一,不能同時(shí)出現(xiàn)在構(gòu)造器的首行,沒(méi)顯式的聲明"this(形參列表)“或"super(形參列表)”,則默認(rèn)調(diào)用的是父類(lèi)中空參的構(gòu)造器:super()在類(lèi)的多個(gè)構(gòu)造器中,至少一個(gè)類(lèi)的構(gòu)造器中使用了"super(形參列表)",調(diào)用父類(lèi)中的構(gòu)造器

舉例:還是用上面的例子,我們?cè)谌祟?lèi)和學(xué)生類(lèi)中添加構(gòu)造器:

public class Person {

 //屬性
 String name = "普通人";//姓名
 int id = 1234;//身份證號(hào)


 //構(gòu)造器
 public Person() {

 }
	
 public Person(String name, int id) {
  this.name = name;
  this.id = id;
 }

 //方法
 public void learn(){
  System.out.println("人要學(xué)習(xí)");
 }
}
public class Student extends Person {

 //聲明了與父類(lèi)的同名屬性
 String name = "哈利波特";//姓名
 int id = 9527;//學(xué)號(hào)


 //構(gòu)造器1
 public Student(String name, int id) {
  this.name = name;
  this.id = id;
 }
	//構(gòu)造器2
 public Student(String name, int id, String name1, int id1) {
  super(name, id);//調(diào)用父類(lèi)已有的構(gòu)造器
  this.name = name1;
  this.id = id1;
 }

 @Override//子類(lèi)重寫(xiě)父類(lèi)的方法
 public void learn() {

  System.out.println("學(xué)生要努力學(xué)習(xí)");
  super.learn();//調(diào)父類(lèi)中原本的方法
  System.out.println("姓名:"+name);//子類(lèi)自己的屬性
  System.out.println("學(xué)號(hào):"+id);
  System.out.println("姓名:"+super.name);//父類(lèi)中聲明的屬性
  System.out.println("身份證號(hào):"+super.id);
 }
}

在子類(lèi)構(gòu)造器2中調(diào)用父類(lèi)已有的有參構(gòu)造器:

然后測(cè)試:實(shí)例化學(xué)生類(lèi)的對(duì)象并給屬性賦值,調(diào)learn方法:

public class Test {
 public static void main(String[] args) {
  Student student = new Student("人",8888,"學(xué)生",2021);
  student.learn();
 }
}

輸出結(jié)果:

在這里插入圖片描述

this與super的區(qū)別總結(jié):

①代表事物不同

​ this表示當(dāng)前所屬函數(shù)的調(diào)用者對(duì)象

​ super表示調(diào)用父類(lèi)的結(jié)構(gòu)(屬性,方法,構(gòu)造器)

②使用前提不同

​ super必須要有繼承關(guān)系才能使用

​ this不需要繼承關(guān)系也能使用

③調(diào)用的構(gòu)造器不同

​ super:調(diào)用父類(lèi)的構(gòu)造器

​ this:調(diào)用當(dāng)前類(lèi)(本類(lèi))的構(gòu)造器

說(shuō)明:

在??臻g中存放的是對(duì)象的引用也就是對(duì)象名指向堆空間中new的對(duì)象,在堆空間中子類(lèi)和父類(lèi)的屬性都會(huì)有,this和super都可以通過(guò)棧空間的引用指向堆空間來(lái)調(diào)用具體的屬性.

在這里插入圖片描述

繼續(xù)加油~~沖沖沖! ! !

總結(jié)

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

相關(guān)文章

  • java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能

    java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能

    這篇文章主要為大家詳細(xì)介紹了java通過(guò)jacob實(shí)現(xiàn)office在線(xiàn)預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Idea配置超詳細(xì)圖文教程(2020.2版本)

    Idea配置超詳細(xì)圖文教程(2020.2版本)

    這篇文章主要介紹了Idea配置超詳細(xì)圖文教程(2020.2版本),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例

    SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例

    這篇文章主要介紹了SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向

    JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向

    這篇文章主要介紹了JavaEE通過(guò)response實(shí)現(xiàn)請(qǐng)求重定向的方法,非常的簡(jiǎn)單實(shí)用,有需要的朋友可以參考下
    2014-10-10
  • 一小時(shí)迅速入門(mén)Mybatis之實(shí)體類(lèi)別名與多參數(shù) 動(dòng)態(tài)SQL

    一小時(shí)迅速入門(mén)Mybatis之實(shí)體類(lèi)別名與多參數(shù) 動(dòng)態(tài)SQL

    這篇文章主要介紹了一小時(shí)迅速入門(mén)Mybatis之實(shí)體類(lèi)別名與多參數(shù) 動(dòng)態(tài)SQL,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates

    IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 運(yùn)用springboot搭建并部署web項(xiàng)目的示例

    運(yùn)用springboot搭建并部署web項(xiàng)目的示例

    這篇文章主要介紹了運(yùn)用springboot搭建并部署web項(xiàng)目的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • maven 使用assembly 進(jìn)行打包的方法

    maven 使用assembly 進(jìn)行打包的方法

    這篇文章主要介紹了maven 使用assembly 進(jìn)行打包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java Flink與kafka實(shí)現(xiàn)實(shí)時(shí)告警功能過(guò)程

    Java Flink與kafka實(shí)現(xiàn)實(shí)時(shí)告警功能過(guò)程

    這篇文章主要介紹了Java Flink與kafka實(shí)現(xiàn)實(shí)時(shí)告警功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java私有構(gòu)造函數(shù)作用原理解析

    Java私有構(gòu)造函數(shù)作用原理解析

    這篇文章主要介紹了Java私有構(gòu)造函數(shù)作用原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論