java中super与this的区别,java中super可以调用父类的方法吗

  java中super与this的区别,java中super可以调用父类的方法吗

  00-1010 1.super关键字1.1 super方法使用1.2 super属性3.this关键字2.1 this属性使用2.2 this方法使用2.3 this访问父类方法3。这与super 3.1的区别是指不同的对象3.2不同的搜索范围3.3此类属性的不同赋值3.4这可用于同步摘要前言:.

  This和super是Java中常见的关键字。虽然在很多情况下可以省略,但是在Java中起到了不可磨灭的作用。都是用来指代对方的。每个类之所以能在实例化时调用对象类(对象类是所有类的父类),都是因为两者的“功劳”。

  

目录

super用于访问父类实例属性和方法。

 

  00-1010如果每个实例类没有显示指定的构造函数,那么它将生成一个隐藏的无参数构造函数。super()方法也是如此。如果指定的super()方法没有显示,子类将生成一个隐藏的super()方法,该方法将用于调用父类的无参数构造函数。这就是我们开头说的:“每个类之所以能在实例化时调用对象类,是因为默认的超级方法起作用。”接下来,我们用一个例子来验证这个说法。

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

  类超例{//测试方法public static void main(string[]args){ son son=new son();} }/* * * parent class */class father { public father(){ system . out . println(执行父类的构造函数);}}/* * *子类*/classson扩展父{ }在以上代码中,子类 Son 并没有显示指定 super() 方法,我们运行以上程序,执行的结果如下:

  从上面的打印结果可以看出,子类Son实际上调用了父类的无参数构造方法而没有显示指定的super()方法,从侧面验证了这一点。如果子类没有显示指定的super()方法,它也会生成一个隐藏的super()方法。这个类生成的字节码文件也证实了这一点,

  如下图所示:

  super 方法注意事项:

  如果显示super()方法,super()方法必须放在构造函数的第一行,否则编译器会报错,

  如下代码所示:

  从上图可以看出,如果super()方法没有放在第一行,那么编译器会报错:表示super()方法必须放在构造函数的第一行。为什么把super()方法放在第一行?这是因为,只要将super()方法放在第一行,就可以确保在实例化子类时,先初始化父类。

  00-1010还可以使用super调用父类的属性。例如,下面的代码可以通过子类Son调用父类中的age属性,

  实现代码如下:

  类超例{//测试方法public static void main(string[]args){ son son=new son();} }/* * * parent class */class Father {//定义一个age属性public int age=30公父(){ super();System.out.println(执行父类的构造函数);}}/* * *子类*/classson扩展父{ public son(){ system . out . println( parent class age 3360 super . age);} }以上程序的执行结

  果如下图所示,在子类中成功地获取到了父类中的 age 属性:

  

 

  

 

  

2.this 关键字

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

 

  

 

  

2.1 this 属性使用

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

 

  

 

  上述代码中 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()); }}

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

 

  

 

  从上述结果可以看出,将 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); }}

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

 

  

 

  从上述结果中可以看出,通过 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(); }}

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

 

  

 

  从上述结果可以看出,使用 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 区别内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: