super关键字的细节

举报
荞慧子 发表于 2022/12/31 23:41:24 2022/12/31
【摘要】 super关键字的细节(1)调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)(2)当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名, 则使用super、this、直接访问的效果是一样的。(3)super的访问不限于直接父类,如果父类的父类和本类中有同名的成员,也可以使用super其访问父类的父类中的成员;如果多...

super关键字的细节

(1)调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)

(2)当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名, 则使用super、this、直接访问的效果是一样的。

(3)super的访问不限于直接父类,如果父类的父类和本类中有同名的成员,也可以使用super其访问父类的父类中的成员;如果多个基类(上级类)中都有同名的成员,使用super调用访问则遵循就近原则(即当A类和B类中都有cal方法时,则在子类-C中调用super.cal()时,就会调用B类中的cal方法,不会调用A类中的,当然也需要遵循访问权限的相关规则)。

调用父类中方法的演示

1)方法一:直接调用cal()方法

定义父类-A,其中包含一个方法cal()

public class A {
    public void cal() { //calculation 计算
        System.out.println("调用了A类的cal()方法。。。");
    }
}

定义子类-B,包含父类-A,然后调用cal()方法

​

public class B extends A{
    public void sum() {

        //方法一:直接调用cal()方法
        cal();
        /*
        找到cal()方法的顺序是:
        (1)先找本类-B,如果有,则直接调用
        (2)如果本类-B没有,则找父类-A,如果父类-A有,则调用
        (3)如果父类-A没有,则继续找父类的父类,直到Object类
        提示:如果查找方法的过程中,找到了,但不能访问(private),则会报错
              如果查找方法的过程中,没有找到,则提示方法不存在
         */

    }
}

​

最后在主类中调用B类的sum()方法的结果为:

2)方法二:利用this调用

利用this调用的主要逻辑思路和直接调用cal()的思路是一样的,但这里我们在B类中增加一个cal()方法,查看sum()方法中会调用父类-A中得cal还是子类-B中的cal

public class B extends A{

    public void cal() { //calculation 计算
        System.out.println("调用了B类的cal()方法。。。");
    }

    public void sum() {
        //方法二:利用this调用
        this.cal();//等价于cal(),和cal()调用的逻辑一样
    }
}

可以看到最后是调用了子类-B中的cal()方法

3)方法三:利用super调用

利用super调用的思路和直接调用以及this就不一样了,因为super调用不会查找本类,会直接查找父类。在子类-B中编写一个cal方法,父类-A中也编写一个cal方法,进行验证

public class A {
    public void cal() { //calculation 计算
        System.out.println("调用了A类的cal()方法。。。");
    }
}
public class B extends A{

     public void cal() { //calculation 计算
        System.out.println("调用了B类的cal()方法。。。");
    }

    public void sum() {
        //方法三:利用super调用
        super.cal();
        //注意:
        // 调用super的查找顺序是按照cal()方法的顺序直接查找父类,
        // 不查找本类的cal(),其他的规则一样
}

主类中验证后会发现并没有调用子类的cal方法,而是直接调用了父类中的方法

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。