百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 行业知识 > 正文

百度大牛都想知道的关于java关键this和super的区别

citgpt 2024-11-25 10:03 4 浏览 0 评论

这篇文章主要给大家介绍了关于java关键字this和super的区别和理解的相关资料,文中通过示例代码介绍得非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

this:

百度大牛都想知道的关于java关键this和super的区别

this理解为:当前对象 或 当前正在创建的对象

可以调用的结构:属性、方法;构造器

this调用属性、方法:

先了解一下形参:

形参的意义就是给属性赋值,我们是要给同名的属性赋值,这时候我们就把形参名和属性的名字写成一样,这样我们就知道我们传入的形参就是要给我们同名的属性去赋值的.

在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,

通常情况下,我们都择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。

举例:我们声明一个类叫鞋类,给它提供私有的属性和get/set方法和构造器:

//声明一个鞋类
public class shoes {
 //鞋的属性
 private String name;//鞋名
 private int id;//编号
 
  
 //无参构造器
 public shoes() {
 }
 
 //有参构造器:
 public shoes(String name, int id) {
//  name = name;没加this
  this.name = name;
//  id = id; 没加this
  this.id = id;
 }
  
  
 //声明两个方法
 public void show(){
  System.out.println("展示~~");
  sale();//show方法中调sale方法
//  this.sale();//this可省略
 }
 public void sale(){
  System.out.println("售卖~~");
 }
 
  
 //get/set方法:
 public String getName() {
  return name;
 }
 public void setName(String name) {
  //name = name;没加this
  this.name = name;
 }
 public void setId(int id) {
  //id = id;没加this
  this.id = id;
 }
 public int getId() {
  return id;
 }
}
 
//测试
class test {
 public static void main(String[] args) {
  //我们先实例化鞋类的对象来调它的属性
  shoes s = new shoes();
  s.setName("nike");//这里的"nike"就是传入的形参
  System.out.println(s.getName());
  //我们获取鞋名的时候,获取不到,意思就是形参的值又赋给了形参,代表没有给鞋的属性赋上值
  //这个时候控制台会输出传入的形参数据类型的默认值,明显不是我们想看到的结果
  s.setId(1);
  System.out.println(s.getId());//鞋的id类似的也会出现同样的情况
   
   
  //"this.方法"举例:
  s.show();
  /*我们先调的是show自己的方法体,然后在show方法中调了sale方法
  意思是s这个对象调了show方法,我们就用调show方法的这个对象s来调sale方法,
  其实在sale();前面也省略了this关键字,表示当前对象(就是调show方法的对象)调的sale方法*/
   
   
System.out.println("------------------------分割线--------------------");
   
   
  shoes s1 = new shoes("李宁",2);//我们new的有参数的对象给它赋初值之后
  System.out.println(s1.getName());
  System.out.println(s1.getId());//如果没有加this,结果还是和没有获取到鞋名和编号
 }
}

先来看没有加this关键字的情况:



结果:



然后我们给鞋属性加上this关键字:



控制台输出的就是我们给鞋设置的名字和编号:



在类的构造器中,我们可以使用"this.属性"或"this.方法"的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。

同样的我们的构造器也是一样:如果有参构造器没有加给属性加this关键字:控制台输出结果也和上面一样



加上之后:


this调用构造器:

① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器

② 构造器中不能通过"this(形参列表)“方式调用自己

③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)”

④ 规定:"this(形参列表)“必须声明在当前构造器的首行

⑤ 构造器内部,最多只能声明一个"this(形参列表)”,用来调用其他的构造器

举例:我们还是写一个Shoes类 提供私有属性和get/set方法并提供三个构造器:

public class Shoes {
 
 //属性
 private String name;//鞋名
 private int id;//编号
 
 //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;
 }
 
 //构造器1
 public Shoes() {
  System.out.println("构造器1");
 }
  
 //构造器2
 public Shoes(int id){
  this();//调构造器1
  System.out.println("构造器2");
  this.id = id;
 }
 
 //构造器3
 public Shoes(String name, int id) {
  //通过调用构造器来执行其他构造器中的代码
  this(id);//调构造器2
//  this.id = id;//交给构造器2来执行
  this.name = name;
 
  //我们如果需要使用到其他构造器中的代码就可以使用"this.构造器"的方式
  //这里只是为了举例我们只写了一行输出语句,真正实际中我们写的代码多了,调用构造器的方法的优势就体现出来了
  //这样我们可以减少代码的冗余,提高程序执行效率
 }
}
class test{
 public static void main(String[] args) {
 
  //用构造器3来实例化对象,我们在构造器3中没有把参数id赋给当前对象
  //但是通过调构造器2,构造器2中执行了 this.id = id;把id赋给了当前对象的属性
  //所以我们才可以得到当前对象s3的id
  Shoes s3 = new Shoes("adidas",2021);
  System.out.println(s3.getId());
 }
}

运行结果:



super:
super 关键字可以理解为:父类的

可以用来调用的结构:
属性、方法、构造器

super调用属性、方法:

我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super."

①特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。

② 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法(也就是父类中原本的方法)。

举例两种特殊情况:在子类的方法中调用父类中同名的属性和方法:

创建一个人类,一个学生类,学生类继承人类,和一个测试类

//人类
public class Person {
 
 //属性
 String name = "普通人";//姓名
 int id = 1234;//身份证号
 
 //方法
 public void learn(){
  System.out.println("人要学习");
 }
}
//学生类
public class Student extends Person {
 
 //声明了与父类的同名属性
 String name = "哈利波特";//姓名
 int id = 9527;//学号
 
 
 @Override//子类重写父类的方法
 public void learn() {
 
  System.out.println("学生要努力学习");
  super.learn();//调父类中原本的方法
  System.out.println("姓名:"+name);//子类自己的属性
  System.out.println("学号:"+id);
  System.out.println("姓名:"+super.name);//父类中声明的属性
  System.out.println("身份证号:"+super.id);
 }
}
//测试类
public class Test {
 public static void main(String[] args) {
  //实例化子类对象
  Student student = new Student();
  //调子类中重写父类的方法
  student.learn();
 }
}

输出结果:



super调用构造器:

我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器

注意:

"super(形参列表)"的使用,必须声明在子类构造器的首行!我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二者取其一,不能同时出现在构造器的首行,没显式的声明"this(形参列表)“或"super(形参列表)”,则默认调用的是父类中空参的构造器:super()在类的多个构造器中,至少一个类的构造器中使用了"super(形参列表)",调用父类中的构造器

举例:还是用上面的例子,我们在人类和学生类中添加构造器:

public class Person {
 
 //属性
 String name = "普通人";//姓名
 int id = 1234;//身份证号
 
 
 //构造器
 public Person() {
 
 }
     
 public Person(String name, int id) {
  this.name = name;
  this.id = id;
 }
 
 //方法
 public void learn(){
  System.out.println("人要学习");
 }
}
public class Student extends Person {
 
 //声明了与父类的同名属性
 String name = "哈利波特";//姓名
 int id = 9527;//学号
 
 
 //构造器1
 public Student(String name, int id) {
  this.name = name;
  this.id = id;
 }
    //构造器2
 public Student(String name, int id, String name1, int id1) {
  super(name, id);//调用父类已有的构造器
  this.name = name1;
  this.id = id1;
 }
 
 @Override//子类重写父类的方法
 public void learn() {
 
  System.out.println("学生要努力学习");
  super.learn();//调父类中原本的方法
  System.out.println("姓名:"+name);//子类自己的属性
  System.out.println("学号:"+id);
  System.out.println("姓名:"+super.name);//父类中声明的属性
  System.out.println("身份证号:"+super.id);
 }
}

在子类构造器2中调用父类已有的有参构造器:

然后测试:实例化学生类的对象并给属性赋值,调learn方法:

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

输出结果:



this与super的区别总结:

①代表事物不同

this表示当前所属函数的调用者对象

super表示调用父类的结构(属性,方法,构造器)

②使用前提不同

? super必须要有继承关系才能使用

? this不需要继承关系也能使用

③调用的构造器不同

? super:调用父类的构造器

? this:调用当前类(本类)的构造器

说明:

在栈空间中存放的是对象的引用也就是对象名指向堆空间中new的对象,在堆空间中子类和父类的属性都会有,this和super都可以通过栈空间的引用指向堆空间来调用具体的属性.



总结

到此这篇关于java关键字this和super的区别和理解的文章就介绍到这了,更多相关java关键字this和super区别内容请关注小编以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!

相关推荐

Win7打开网页特别慢的原因?

经常打开Web的频繁用户的数量应该打开,因此,一旦网页的速度很慢,它会变得非常敏感。最近,Win7系统的用户发现他们打开了他们的网页,突然放慢了,绝不看网络速度和配置因素,最有可能是系统内存问题。如果...

电脑浏览器下载速度很慢怎么办

有网友反映自己的浏览器下载速度很慢怎么办?这种通过可能是浏览器缓存太多,没有优化等原因导致。下面小编就以几种常用的浏览器为例,给大家解答下...

网站打开慢的问题如何解决?

  当我们在浏览网页时,突然发现一个网站打不开或者加载速度非常慢,这时候你会不会感到很烦躁呢?别担心,今天我们就来教你解决网站打开慢的问题!  一、检查网络连接  我们需要确保自己的网络连接正常。请尝...

打开网页速度慢、下载速度慢、玩游戏延迟、频繁掉线的解决方法

影响实际上网速度的因素非常多,需要挨个做排查1、先排除是否是网络环境问题,可以核实以下情况,来判断是否是网络环境问题。(1)同一网络环境,如果其他电脑上网也很慢,则可判断是网络本身速度不快导致的。(2...

浏览器太卡、启动慢,教你一招提速至少一倍!

电脑端浏览器用久了都会有一个毛病那就是开启速度非常缓慢今天教大家一个小技巧可大大提升浏览器启动速度适用于QQ、360、搜狗等大多数浏览器提速效果非常明显启动速度至少要快一倍SpeedyFox支持平台:...

网站访问慢的排查方案(最详细)

说实话,比起网站打不开,网站访问慢更让人抓狂。因为造成网站访问慢的因素太多了,一般用户根本无从下手!任他千头万绪的问题,从以下三个方面入手,也能轻松破解访问慢的大难题:响应时间、执行时间、加载时间。...

电脑网页打开慢怎么办?金山毒霸电脑医生秒搞定

??在网络时代,上网是每天都会做的事,平时用手机上网比较多,但是工作的时候还是用电脑上网的,不管手机还是电脑都会越用越慢。有时会觉得,电脑配置也不低,每天都清理垃圾了都,网速也还行电脑怎么还上网这么慢...

家里wifi慢是怎么回事?教你几招提速方法

没WiFi,不成活!手机和WiFi之间,就像空调加棉被,谁也离不开谁。如今WiFi已经填满了我们生活的每个角落,很难想象,如果哪天没了网,世界会变成什么样!可是家里的WiFi是越用越慢,不知道有多少人...

连接路由器宽带测速正常,打开网页很慢?

电脑连接路由器后测试网速和申请的宽带一致,但打开网页的速度较慢,请参考以下步骤排查:1、更改DNS服务器电脑上获取的DNS服务器不稳定可能会导致打开网页较慢,可以在电脑的本地连接或无线连接手动设置DN...

手机打开网页非常慢,那是你用的浏览器不对!

今天世超独宠Android差友不知道大家平日里,在刷着微博浏览着新闻的时候有没有遇见过这样的情况:在你浏览的过程中,总会出现一些让你感兴趣的链接。这些链接可能是:”这个视频,女人不在家男人偷偷看!”“...

网站打开慢的原因有哪些?

网络能够为大家带来许多便利,现在的人们不管是在学习或者是工作当中都是离不开网络的。在网络中,各大网页和网站也是我们浏览信息的主要渠道。如果想要更加高效率的工作和学习的话,当然也离不开网站浏览速度的支持...

告诉你导致网站页面打开速度慢的几种情况

导致网站页面打开速度慢的原因有很多,主要注意以下几个方面,就能做到很好的避免。...

浏览器变慢有救了!只要2秒,重回新安装一样爽快!

而最近有小伙伴在后台留言,说自己电脑浏览器用久了后,速度变得越来越慢了。特别是用久后,每次打开浏览器加载半天,经常白屏卡上那么一小会,体验上要比看这loging在转还难受,差点以为死机了。其...

导致网站打开慢的原因以及解决方法

是什么原因会导致网站打开慢?又有什么办法解决呢?一般来说,http请求过多、网页过大、服务器性能过差等等都可能导致网站打开慢。www.xy3000.com小蚁云安全乔妹为您分享一些参考解决方法:研究表...

还在为打开网页慢而苦恼吗?试试这招

不知道大家有没有这种感觉,家里网速明明很快,有20M,50M甚至100M,但不知道为什么打开网页,浏览页面的时候总感觉加载速度很慢。其实上网速度的快慢不仅仅取决于你家的宽带速度,也跟你的电脑硬件,系...

取消回复欢迎 发表评论: