当前位置: 首页 > 后端技术 > Java

面试官:这个和super有什么区别?这个可以调用到父类吗?

时间:2023-04-02 00:51:14 Java

本文已收录《Java常见面试题》:https://gitee.com/mydb/interview这个和super是Java中常用的关键字。尽管在许多情况下两者都可以省略,但在Java中都会使用它们。所起的作用不可磨灭。它们都用来指代每个班级。每个类之所以在实例化时都能调用到Object类(Object类是所有类的父类),全是两者的“功劳”。1、super关键字super用于访问父类实例的属性和方法。1.1super方法使用各个实例类。如果没有显式指定的构造函数,它会生成一个隐藏的无参构造函数。super()方法也是如此。如果没有显式指定super()方法,那么子类会生成一个隐藏的super()方法来调用父类的无参构造函数。这就是我们开头说的“每个类在实例化时都能调用Object类的原因是默认的super方法起作用了”。接下来,我们将通过一个例子来验证这个说法。PS:所谓“显示”是指在程序中主动调用,即在程序中加入相应的执行代码。publicclassSuperExample{//测试方法publicstaticvoidmain(String[]args){Sonson=newSon();}}/***父类*/classFather{publicFather(){System.out.println("执行父类的构造函数");}}/***subclass*/classSonextendsFather{}在上面的代码中,子类Son没有指定super()方法,我们运行上面的程序,执行结果如下:从上面的打印结果,可以看出子类Son实际上是在没有指定super()方法的情况下调用了父类的无参构造方法,从侧面验证了这一点。如果子类没有显示指定super()方法,那么它也会生成一个隐藏的super()方法。我们从该类生成的字节码文件中也可以证实这一点,如下图所示:,否则编译时编译器会报错,如下代码所示:上图中可以看到,如果super()方法没有放在第一行,编译器会报错:提示super()方法必须放在构造方法的第一行。为什么要把super()方法放在第一行?这是因为,只要把super()方法放在第一行,就可以保证子类实例化时父类先初始化。1.2使用super属性使用super也可以调用父类的属性。比如下面的代码可以通过子类Son调用父类中的age属性。实现代码如下:publicclassSuperExample{//测试方法publicstaticvoidmain(String[]args){Sonson=newSon();}}/***parentclass*/classFather{//定义一个年龄属性publicintage=30;公共父亲(){超级();System.out.println("执行父类的构造函数");}}/***subclass*/classSonextendsFather{publicSon(){System.out.println("父类年龄:"+super.age);}}上面程序的执行结果如下图所示。在子类中成功获取到父类中的age属性:2.this关键字this用于访问本类的实例属性和方法。如果在本类中找不到,则在父类中查找。2.1this属性的使用this最常见的用法就是给这个类的属性赋值,比如常见的setter方法,如下代码所示:上面代码中this.name代表Person的name属性类,这里的this关键字不能省略,如果省略,相当于给当前局部变量name赋name,给自己赋值。我们可以尝试取消this关键字,实现代码如下:classPerson{privateStringname;publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){返回名称;}}publicclassThisExample{publicstaticvoidmain(String[]args){Personp=newPerson();p.setName("雷格");System.out.println(p.getName());}}以上程序执行结果如下图所示:从上面的结果可以看出,去掉this关键字后,赋值失败,Person对象中的name属性为null。2.2this方法的使用我们可以使用this()方法调用本类的构造函数,具体实现代码如下:publicclassThisExample{//testmethodpublicstaticvoidmain(String[]args){Sonp=新儿子(“Java”);}}/***父类*/classFather{publicFather(){System.out.println("执行父类的构造函数");}}/***Subclass*/classSonextendsFather{publicSon(){System.out.println("子类中的无参数构造函数");}publicSon(Stringname){//使用this调用这个类中的无参构造函数this();System.out.println("子类有参数化构造方法,名称:"+name);}}上面程序的执行结果如下图所示:从上面的结果可以看出,this()方法调用成功到达了这个类中的无参构造方法。注意:this()方法的使用规则与super()方法相同。如果显示调用,则只能放在方法的第一行。2.3this访问父类方法接下来我们尝试使用this访问父类方法,具体实现代码如下:publicclassThisExample{publicstaticvoidmain(String[]args){Sonson=newSon();儿子.sm();}}/***父类*/classFather{publicvoidfm(){System.out.println("调用了父类中的fm()方法");}}/***childclass*/classSonextendsFather{publicvoidsm(){System.out.println("调用子类的sm()方法访问父类的方法");//在父类中调用方法this.fm();}}上面程序的执行结果如下:从上面的结果可以看出,使用this可以访问到父类中的方法。这个会先在本类中查找,如果找不到,再在父类中查找。三、this和super的区别1、所指的对象不同。super是指父类,用于访问父类;而this指的是当前班级。2、搜索范围不同。super只能查找父类,但是this会先从本类开始查找,如果查找不到,就会在父类中查找。3.这个类的属性赋值不同。这个可以用来给这个类的实例属性赋值,但是super不能实现这个功能。4.this可以用于sy??nchronized,因为this代表当前对象,所以this可以用于sy??nchronized(this){....}中的加锁,但是super无法实现这个功能。综上所述,this和super都是Java中的关键字,都起到了引用的作用。显式使用它们时,需要将它们放在方法的第一行(否则编译器会报错)。this代表当前对象,super用来引用父类对象。它们有四个区别:引用对象、查找访问、本类的属性赋值、synchronized的使用。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题解析