零基础学Java|在实例方法中如何使用super关键字

Posted link可

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础学Java|在实例方法中如何使用super关键字相关的知识,希望对你有一定的参考价值。

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

//书
public class Book {
    //书名
    String name;
    //构造方法
    public Book(){
        super();
    }
    public Book(String name){
        super();
        this.name = name;
    }
}
//纸质书
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);
    }
}
public class BookTest {
    public static void main(String[] args) {
        PaperBook book1 = new PaperBook("零基础学Java卷I");
        book1.printName();
    }
}

运行结果如下图所示:

图1:super和this

我们发现printName()方法中的super.name和this.name最终输出结果是一样的,这是为什么呢?

请看以上程序执行的内存图:

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

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

通过以上内存结构图发现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);
    }
}

运行结果如下图所示:

图4:super和this的区别

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

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

图6:子类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());
    }
}
public class VipTest {
    public static void main(String[] args) {
        Vip vip = new Vip();
        vip.test();
    }
}

运行结果如下图所示:

图7:运行结果

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

最后

推荐给大家个比较详细的Java零基础教程,下面这个是我看过的觉得挺不错的,值得观看收藏。

分享给大家,点这里

看完如果对你有帮助,感谢点赞支持~

以上是关于零基础学Java|在实例方法中如何使用super关键字的主要内容,如果未能解决你的问题,请参考以下文章

零基础学java-类和对象

零基础如何学好Java开发

零基础学Java—成员变量和局部变量

零基础学Java—内部类的概念与分类(三十)

Java基础之this和super关键字用法

零基础学Java—重写(二十)