java 中 super_Java中super关键字的使用(在实例方法中)

本文详细介绍了Java中super关键字的使用场景,特别是在实例方法中的应用。通过示例展示了当子类重写父类的实例变量或方法时,如何通过super来访问父类的成员。总结了super在哪些情况下不能省略,强调了当子类中有同名实例变量或方法时,super的必要性。最后通过代码测试验证了super在实例方法中的行为。
摘要由CSDN通过智能技术生成

Java中super关键字的使用(在实例方法中)

super和this都可以使用在实例方法中,并且都不能使用在静态方法当中,“this”大部分情况下都是可以省略的,只有在方法中区分局部变量和实例变量的时候不能省略。那“super”什么时候可以省略,什么时候不能省略呢?

//书

public class Book {

//书名

String name;

//构造方法

public Book(){

super();

}

public Book(String name){

super();

this.name = name;

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

//纸质书

public class PaperBook extends Book {

//构造方法

public PaperBook(){

super();

}

public PaperBook(String name){

super();

this.name = name;

}

//打印书名

public void printName(){

System.out.println("this.name->书名 : " + this.name);

System.out.println("super.name->书名 : " + super.name);

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

public class BookTest {

public static void main(String[] args) {

PaperBook book1 = new PaperBook("零基础学Java卷I");

book1.printName();

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果如下图所示:

2349b0e5addcfbe36f078f572d1b4e5f.png

图14-11:super和this

我们发现printName()方法中的super.name和this.name最终输出结果是一样的,这是为什么呢?请看以上程序执行的内存图:

25d7ae4b55a6cf2c34319aa927a01191.png

图14-12:父类的构造方法执行结束之后的内存图

7e0c4a47b356f97fe08592a46a7aa585.png

图14-13:子类的构造方法执行结束之后的内存图

通过以上内存结构图发现this.name和super.name实际上是同一块内存空间,所以它们的输出结果是完全一样的。接下来,我们再把以上的PaperBook类修改一下:

//纸质书

public class PaperBook extends Book {

String name; //在子类中也定义了一个name属性

//构造方法

public PaperBook(){

super();

}

public PaperBook(String name){

super();

this.name = name;//这里的this.name代表子类的name

}

//打印书名

public void printName(){

System.out.println("this.name->书名 : " + this.name);

System.out.println("super.name->书名 : " + super.name);

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果如下图所示:

c547e4fd673f3147a43921e3400ce063.png

图14-14:super和this的区别

为什么super.name是null呢,我们一起来看看以上程序的内存图:

0f141631b2c13d2d8102187c59c74ae9.png

图14-15:父类Book的构造方法执行之后的内存图

6749c85f3056097763dafba13ae704a9.png

图14-16:子类PaperBook的构造方法执行结束之后的内存图

通过以上内存图可以清楚的看到,父类Book的构造方法在执行的时候给super.name赋值null,子类PaperBook的构造方法在执行的时候给this.name赋值“零基础学Java卷I”,由于在子类PaperBook中定义了重名的变量name导致在当前对象中有两个name,一个是从父类中继承过来的,一个是自己的,如果此时想访问父类中继承过来的name则必须使用super.name,当直接访问name或者this.name都表示访问当前对象自己的name。

通过以上的学习,大家知道super在什么情况下不能省略了吗?当父类中有该实例变量,子类中又重新定义了同名的实例变量,如果想在子类中访问父类的实例变量,super不能省略。实例方法是这样吗?我们可以来测试一下,请看代码:

public class Vip {

//Vip默认继承Object

//重写从Object类中继承过来的toString()方法

public String toString(){

return "我是金牌会员";

}

public void test(){

System.out.println(super.toString());

System.out.println(this.toString());

System.out.println(toString());

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

public class VipTest {

public static void main(String[] args) {

Vip vip = new Vip();

vip.test();

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果如下图所示:

78d8c11e484c972f5e8b18516b9401b7.png

图14-17:运行结果

通过以上测试得出最终结论:父类和子类中有同名实例变量或者有同名的实例方法,想在子类中访问父类中的实例变量或实例方法,则super是不能省略的,其它情况都可以省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值