服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java中this和super的区别及this能否调用到父类使用

Java中this和super的区别及this能否调用到父类使用

2022-12-16 16:59Java中文社群 Java教程

这篇文章主要介绍了Java中this和super的区别及this能否调用到父类使用,this和super都是Java中常见的关键字,下文关于两者区别介绍,需要的小伙伴可以参考一下

前言:

this 和 super 都是 Java 中常见的关键字,虽然二者在很多情况下都可以被省略,但它们在 Java 中所起的作用是不可磨灭的。它们都是用来起指代作用的,每个类在实例化的时候之所以能调用到 Object 类(Object 类是所有类的父类),全是二者的“功劳”。

 

1.super 关键字

super 是用来访问父类实例属性和方法的。

1.1 super 方法使用

每个实例类如果没有显示的指定构造方法,那么它会生成一个隐藏的无参构造方法。对于 super() 方法也是类似,如果没有显示指定 super() 方法,那么子类会生成一个隐藏的 super() 方法,用来调用父类的无参构造方法,这就是咱们开篇所说的“每个类在实例化的时候之所以能调用到 Object 类,就是默认 super 方法起作用了”,接下来我们通过实例来验证一下这个说法。

PS:所谓的“显示”,是指在程序中主动的调用,也就是在程序中添加相应的执行代码。

public class SuperExample {
  // 测试方法
  public static void main(String[] args) {
      Son son = new Son();
  }
}

/**
* 父类
*/
class Father {
  public Father() {
      System.out.println("执行父类的构造方法");
  }
}

/**
* 子类
*/
class Son extends Father {
}

在以上代码中,子类 Son 并没有显示指定 super() 方法,我们运行以上程序,执行的结果如下:

Java中this和super的区别及this能否调用到父类使用

从上述的打印结果可以看出,子类 Son 在没有显示指定 super() 方法的情况下,竟然调用了父类的无参构造方法,这样从侧面验证了,如果子类没有显示指定 super() 方法,那么它也会生成一个隐藏的 super() 方法。这一点我们也可以从此类生成的字节码文件中得到证实,

如下图所示:

Java中this和super的区别及this能否调用到父类使用

super 方法注意事项:

如果显示使用 super() 方法,那么 super() 方法必须放在构造方法的首行,否则编译器会报错,

如下代码所示:

Java中this和super的区别及this能否调用到父类使用

如上图看到的那样,如果 super() 方法没有放在首行,那么编译器就会报错:提示 super() 方法必须放到构造方法的首行。 为什么要把 super() 方法放在首行呢? 这是因为,只要将 super() 方法放在首行,那么在实例化子类时才能确保父类已经被先初始化了。

1.2 super 属性使用

使用 super 还可以调用父类的属性,比如以下代码可以通过子类 Son 调用父类中的 age 属性,

实现代码如下:

public class SuperExample {
  // 测试方法
  public static void main(String[] args) {
      Son son = new Son();
  }
}

/**
* 父类
*/
class Father {
  // 定义一个 age 属性
  public int age = 30;

  public Father() {
      super();
      System.out.println("执行父类的构造方法");
  }
}

/**
* 子类
*/
class Son extends Father {
  public Son() {
      System.out.println("父类 age:" + super.age);
  }
}

以上程序的执行结果如下图所示,在子类中成功地获取到了父类中的 age 属性:

Java中this和super的区别及this能否调用到父类使用

 

2.this 关键字

this 是用来访问本类实例属性和方法的,它会先从本类中找,如果本类中找不到则在父类中找。

2.1 this 属性使用

this 最常见的用法是用来赋值本类属性的,比如常见的 setter 方法,如下代码所示:

Java中this和super的区别及this能否调用到父类使用

上述代码中 this.name 表示 Person 类的 name 属性,此处的 this 关键字不能省略,如果省略就相当于给当前的局部变量 name 赋值 name,自己给自己赋值了。我们可以尝试一下,将 this 关键字取消掉,

实现代码如下:

class Person {
  private String name;
  public void setName(String name) {
      this.name = name;
  }
  public String getName() {
      return name;
  }
}
public class ThisExample {
  public static void main(String[] args) {
      Person p = new Person();
      p.setName("磊哥");
      System.out.println(p.getName());
  }
}

以上程序的执行结果如下图所示:

Java中this和super的区别及this能否调用到父类使用

从上述结果可以看出,将 this 关键字去掉之后,赋值失败,Person 对象中的 name 属性就为 null 了。

2.2 this 方法使用

我们可以使用 this() 方法来调用本类中的构造方法,具体实现代码如下:

public class ThisExample {
  // 测试方法
  public static void main(String[] args) {
      Son p = new Son("Java");
  }
}
/**
* 父类
*/
class Father {
  public Father() {
      System.out.println("执行父类的构造方法");
  }
}

/**
* 子类
*/
class Son extends Father {
  public Son() {
      System.out.println("子类中的无参构造方法");
  }
  public Son(String name) {
      // 使用 this 调用本类中无参的构造方法
      this();
      System.out.println("子类有参构造方法,name:" + name);
  }
}

以上程序的执行结果如下图所示:

Java中this和super的区别及this能否调用到父类使用

从上述结果中可以看出,通过 this() 方法成功调用到了本类中的无参构造方法。

注意:this() 方法和 super() 方法的使用规则一样,如果显示的调用,只能放在方法的首行。

2.3 this 访问父类方法

接下来,我们尝试使用 this 访问父类方法,具体实现代码如下:

public class ThisExample {
  public static void main(String[] args) {
      Son son = new Son();
      son.sm();
  }
}
/**
* 父类
*/
class Father {
  public void fm() {
      System.out.println("调用了父类中的 fm() 方法");
  }
}

/**
* 子类
*/
class Son extends Father {
  public void sm() {
      System.out.println("调用子类的 sm() 方法访问父类方法");
      // 调用父类中的方法
      this.fm();
  }
}

以上程序的执行结果如下:

Java中this和super的区别及this能否调用到父类使用

从上述结果可以看出,使用 this 是可以访问到父类中的方法的,this 会先从本类中找,如果找不到则会去父类中找。

 

3.this 和 super 的区别

3.1 指代的对象不同

super 指代的是父类,是用来访问父类的;而 this 指代的是当前类。

3.2 查找范围不同

super 只能查找父类,而 this 会先从本类中找,如果找不到则会去父类中找。

3.3 本类属性赋值不同

this 可以用来为本类的实例属性赋值,而 super 则不能实现此功能。

3.4 this 可用于 synchronized

因为 this 表示当前对象,所以this 可用于 synchronized(this){....} 加锁,而 super 则不能实现此功能。

 

总结

this 和 super 都是 Java 中的关键字,都起指代作用,当显示使用它们时,都需要将它们放在方法的首行(否则编译器会报错)。this 表示当前对象,super 用来指代父类对象,它们有四点不同:指代对象、查找访问、本类属性赋值和 synchronized 的使用不同。

到此这篇关于Java中this和super的区别及this能否调用到父类使用的文章就介绍到这了,更多相关this和super 区别内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7046994591253266440

延伸 · 阅读

精彩推荐
  • Java教程mybatis-plus使用问题小结

    mybatis-plus使用问题小结

    这篇文章主要介绍了mybatis-plus使用问题汇总,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    别动我的猫10262022-08-11
  • Java教程Apache Commons Math3学习之数值积分实例代码

    Apache Commons Math3学习之数值积分实例代码

    这篇文章主要介绍了Apache Commons Math3学习之数值积分实例代码,涉及使用辛普森积分的例子,这里分享给大家,供需要的朋友参考。...

    狐帝12152021-01-22
  • Java教程javascript与jsp发送请求到servlet的几种方式实例

    javascript与jsp发送请求到servlet的几种方式实例

    本文分别给出了javascript发送请求到servlet的5种方式实例与 jsp发送请求到servlet的6种方式实例...

    Java教程网10722021-04-13
  • Java教程spring boot 如何请求后缀匹配

    spring boot 如何请求后缀匹配

    这篇文章主要介绍了spring boot 请求后缀匹配的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    xutatu3442022-01-24
  • Java教程java基础之异常详解

    java基础之异常详解

    这篇文章主要介绍了java基础之异常详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下...

    池鱼i_10992021-10-14
  • Java教程Spring AOP注解案例及基本原理详解

    Spring AOP注解案例及基本原理详解

    这篇文章主要介绍了Spring AOP注解案例及基本原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    挣扎一下4652020-06-29
  • Java教程SpringBoot Admin 如何实现Actuator端点可视化监控

    SpringBoot Admin 如何实现Actuator端点可视化监控

    这篇文章主要介绍了SpringBoot Admin 如何实现Actuator端点可视化监控,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    Heartsuit7842021-12-11
  • Java教程Java WeakHashMap案例详解

    Java WeakHashMap案例详解

    这篇文章主要介绍了Java WeakHashMap案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Jennire_Q11192021-11-24