当前位置: 首页 > 科技观察

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

时间:2023-03-19 14:57:27 科技观察

this和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.2super属性的使用使用super也可以调用父类的属性。比如下面的代码可以通过子类Son调用父类的age属性。实现代码如下:publicclassSuperExample{//测试方法publicstaticvoidmain(String[]args){Sonson=newSon();}}/***parentclass*/classFather{//定义一个age属性publicintage=30;publicFather(){super();System.out.println("执行父类的构造函数");}}/***Subclass*/classSonextendsFather{publicSon(){System.out.println("父类age:"+super.age);}}上面程序的执行结果如下图所示,在子类成功获取到父类中的age属性:图2.this关键字this用于访问本类的实例属性和方法,它会先从本类中寻找,如果在本类中找不到,2.1这个属性的使用this最常见的用法就是给本类的属性赋值,比如常见的setter方法,如下代码所示:在上面的代码中,this.name表示Person类的name属性,这里的this关键字不能省略,省略相当于给当前局部变量name赋name,给自己赋值。我们可以尝试取消这个关键字,实现代码如下:=newPerson();p.setName("Leige");System.out.println(p.getName());}}上面程序的执行结果如下图所示:从上面的结果我们可以看到这个去掉关键字后,赋值失败,Person对象中的name属性为null。2.2this方法的使用我们可以使用this()方法调用本类中的构造方法,具体实现代码如下:publicclassThisExample{//testmethodpublicstaticvoidmain(String[]args){Sonp=newSon("Java");}}/***父类*/classFather{publicFather(){System.out.println("执行父类的构造函数");}}/***子类*/classSonextendsFather{publicSon(){系统输出。println("子类无参构造方法");}publicSon(Stringname){//用这个调用本类无参构造方法this();System.out.println("子类有参构造方法,name:"+name);}}上面程序的执行结果如下图所示:从上面的结果可以看出,通过this()方法成功调用了本类中的无参构造方法。注意:this()方法的使用规则与super()方法相同。如果显示调用,则只能放在方法的第一行。2.3this访问父类方法接下来我们尝试使用this访问父类方法,具体实现代码如下:publicclassThisExample{publicstaticvoidmain(String[]args){Sonson=newSon();son.sm();}}/***父类*/classFather{publicvoidfm(){System.out.println("调用了父类中的fm()方法");}}/***子类*/classSoextendsFather{publicvoidsm(){System.out.println("调用子类的sm()方法访问父类的方法");//调用父类中的方法this.fm();}}执行上面程序运行结果如下:从上面的运行结果可以看出,使用this来访问父类中的方法。这个会先在本类中查找,如果找不到,再在父类中查找。3.这个和super1)的区别。所指对象不同。super是指父类,用于访问父类;而this指的是当前班级。2).搜索范围不同。super只能查找父类,但是this会先从本类开始查找,如果查找不到,就会在父类中查找。3).这个类的属性赋值是不同的。这个可以用来给这个类的实例属性赋值,但是super不能实现这个功能。4).this可以用于sy??nchronized,因为this代表的是当前对象,所以this可以用于sy??nchronized(this){....}中的加锁,但是super无法实现这个功能。综上所述,this和super都是Java中的关键字,都起到了引用的作用。显式使用它们时,需要将它们放在方法的第一行(否则编译器会报错)。this代表当前对象,super用来引用父类对象。它们有四个区别:引用对象、查找访问、本类的属性赋值、synchronized的使用。本文转载自微信公众号《Java面试题解析》,可通过以下二维码关注。转载本文请联系Java面试真题解析公众号。