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方法,而是直接调用了父类中的方法
- 点赞
- 收藏
- 关注作者
评论(0)