博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java面试知识点(三十)super和this关键字
阅读量:3781 次
发布时间:2019-05-22

本文共 3414 字,大约阅读时间需要 11 分钟。

this

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

this 的用法在 java 中大体可以分为 3 种:

  1. 普通的直接引用

这种就不用讲了,this 相当于是指向当前对象本身。

  1. 形参与成员名字重名,用 this 来区分:

  2. 引用构造函数

这个和 super 放在一起讲,见下面。

super

super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

super 也有三种用法:

  1. 普通的直接引用

与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。

  1. 子类中的成员变量或方法与父类中的成员变量或方法同名
class Country {
String name; void value() {
name = "China"; }} class City extends Country {
String name; void value() {
name = "Shanghai"; super.value(); //调用父类的方法 System.out.println(name); System.out.println(super.name); } public static void main(String[] args) {
City c=new City(); c.value(); }}

运行结果:

Shanghai

China

  1. 引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

class Person {
public static void prt(String s) {
System.out.println(s); } Person() {
prt("父类·无参数构造方法: "+"A Person."); }//构造方法(1) Person(String name) {
prt("父类·含一个参数的构造方法: "+"A person's name is " + name); }//构造方法(2) } public class Chinese extends Person {
Chinese() {
super(); // 调用父类构造方法(1) prt("子类·调用父类”无参数构造方法“: "+"A chinese coder."); } Chinese(String name) {
super(name);// 调用父类具有相同形参的构造方法(2) prt("子类·调用父类”含一个参数的构造方法“: "+"his name is " + name); } Chinese(String name, int age) {
this(name);// 调用具有相同形参的构造方法(3) prt("子类:调用子类具有相同形参的构造方法:his age is " + age); } public static void main(String[] args) {
Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } }

运行结果:

父类・无参数构造方法: A Person.

子类・调用父类” 无参数构造方法 “: A chinese coder.
父类・含一个参数的构造方法: A person’s name is codersai
子类・调用父类” 含一个参数的构造方法 “: his name is codersai
父类・含一个参数的构造方法: A person’s name is codersai
子类・调用父类” 含一个参数的构造方法 “: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

从本例可以看到,可以用 super 和 this 分别调用父类的构造方法和本类中其他形式的构造方法。

例子中 Chinese 类第三种构造方法调用的是本类中第二种构造方法,而第二种构造方法是调用父类的,因此也要先调用父类的构造方法,再调用本类中第二种,最后是重写第三种构造方法。

super 和 this 的异同

  • super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
  • this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
  • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数(这里指的隐藏的成员变量是指default修饰和protected修饰的变量),基类与派生类中有相同成员定义时如:super. 变量名 super. 成员函数据名(实参)
  • this:它代表当前对象名(在程序中易产生二义性之处,应使用 this 来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用 this 来指明成员变量名)
  • 调用 super () 必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用 super (),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
  • super () 和 this () 类似,区别是,super () 从子类中调用父类的构造方法,this () 在同一类内调用其它方法。
  • super () 和 this () 均需放在构造方法内第一行。
  • 尽管可以用 this 调用一个构造器,但却不能调用两个。
  • this 和 super 不能同时出现在一个构造函数里面,因为 this 必然会调用其它的构造函数,其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
  • this () 和 super () 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。
  • 从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字。

注意

1.super()函数是在所有子类构造器第一行都存在的(隐式或显示的调用)。这是代表调用基类的无参构造器

2.当类不存在构造器的时候,java虚拟机是默认给类添加一个无参构造器的,但是当只存在有参构造器,不存在无参构造器的时候,虚拟机不会隐式构造无参构造器,这个时候,子类如果还隐式调用super(),就会编译出错。所以需要显示加上super(形参);形参内容根据子类决定

class Parent {
Parent(String name) {
System.out.println("有参构造器+"+name); }}public class Child extends Parent {
Child() {
// super("xsj"); // 没有这个语句,就会报错 System.out.println("子类无参构造器"); } public static void main(String[] args) {
Child c = new Child(); }}

转载地址:http://hslvn.baihongyu.com/

你可能感兴趣的文章
区间和并问题 思路加模板整理(校门外的树)
查看>>
C++中next_permutation函数的使用方法、原理及手动实现
查看>>
网络流常用小技巧之 拆点
查看>>
最大权闭合子图
查看>>
最小权点覆盖集 与 最大权独立集
查看>>
POJ 2125 Destroying The Graph && Acwing 2325. 有向图破坏(拆点+最小权点覆盖集)
查看>>
计算几何基础知识整理大全 代码模板与证明过程 (直线、向量、多边形、三维计算几何、凸包、半平面交、最小圆覆盖)
查看>>
计算几何之 判断两线段是否相交 代码模板与证明
查看>>
三维计算几何之三维凸包 增量法
查看>>
MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)
查看>>
9篇小白都能懂系列博客学完MySQL基础
查看>>
还在为Linux入门发愁?
查看>>
如何优雅而又不失内涵的在centos7下安装tree命令
查看>>
彻底掌握Linux文件与目录管理命令?进来看看硬核总结
查看>>
一文搞定Vim/Vi编辑器
查看>>
剑指offer之斐波那契问题(C++/Java双重实现)
查看>>
Linux网络命令
查看>>
一天教会三岁表弟HTML,你值得拥有
查看>>
CSS基础汇总
查看>>
SpringCloud服务注册与发现
查看>>