关于java关键字this和super的区别和理解

this:

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.方法"举例:我们声明两个方法show和sale方法来举例体会一下this的作用:代码参照上面:

s.show();的结果:

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区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Java使用super和this来重载构造方法

    详解Java使用super和this来重载构造方法 实例代码: //父类 class anotherPerson{ String name = ""; String age = ""; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void setName(String name){ this.name = name;

  • 详解Java中super的几种用法并与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 复制代码 代码如下: class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static voi

  • Java this()和super()的使用注意

    Java this()和super()的使用注意 使用super和this应该注意这些: 1)调用super()必须写在子类构造方法的第一行,否则编译不通过.每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错. 2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法. 3)super()和this()均需放在构造方法内第一行. 4)尽管可以用this调用一个构造器,但

  • 举例讲解Java编程中this关键字与super关键字的用法

    this 总要有个事物来代表类的当前对象,就像C++中的this指针一样,Java中的this关键字就是代表当前对象的引用. 它有三个主要的作用: 1.在构造方法中调用其他构造方法.       比如有一个Student类,有三个构造函数,某一个构造函数中调用另外构造函数,就要用到this(),而直接使用Student()是不可以的. 2.返回当前对象的引用. 3.区分成员变量名和参数名. 看下面的例子: public class Student { private String name; p

  • Java中的this和super实例浅析

    要说this和super就不得不说Java的封装和继承了,首先说封装,这是一种思想,算不上一种技术,核心思想就是将对象的同一行为和状态看成是一个整体,将无需对外界暴露的属性和方法隐藏起来,比如一些方法的具体实现和一些私有的变量,通过公共的方法提供对属性的操作,从而提高安全性. class Person { private String name = "无名氏";//私有的内部成员变量 private int age = 20;//私有的内部成员变量 public void sayHel

  • Java super和this的对比及使用

    Java super和this的对比及使用 super和this的异同 1)super(参数列表):调用父类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数列表):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 2)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名   super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用t

  • java中this与super关键字的使用方法

    java中this与super关键字的使用方法 这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本身. 2.形参与成员名字重名,用this来区分: class Person { private int age = 10; public Perso

  • Java中的构造方法this、super的用法详解

    1.构造方法 定义:与类同名没有返回值的方法称为构造方法: public class test1 { private String name; private int age; public test1(){ } } 上面的test1()是默认构造方法,即使没有定义java虚拟机在运行的时候也会自动生成, 当然如果定义了重载的构造方法便不会自动生成: 构造方法的作用有两点1.通过构造方法建立一个对象:2.通过构造方法可以快速的赋初值: public class Main { public sta

  • java this super使用方法详解

    super是Java语言的保留字,用来指向类的超类. 假设在Teacher类中定义了一个类变量boolean gender; 在子类的方法中gender就应该是指子类的gender变量,如果要引用超类的gender变量的话就必须使用 super.genderthis对象在类的构造方法中,要给对象的域进行初始化,这时如果参数和类变量同名,则类变量的名字将会被参数名屏蔽, 必须知道当前的对象名称,才能用对象名引用对象的域 复制代码 代码如下: public DotLoc(double XX,doub

  • 详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. getClass()是java中Object类的一个方法,其原型为: public final Class<?> getClass() 返回值为 当前运行时类的Class对象. 所以写了一段代码来说明: getClass()不受this和super影响,而是有当前的运行类决定的. 代码如下: 父类

随机推荐