这次介绍super关键字,super表示父类的引用的。一个类如果继承了另外一个类,那么这个类的对象的引用是this,继承的那个类的引用就是super
super如何来使用?
super如何来用呢?在代码表现上和this一样.就是super.方法(),super.变量。super()调用父类构造方法
有这么两个类,孩子类和父亲类. Child继承Father类
public class Child extends Father{
public String money;//子类的钱
public void printMsg(){
super.printMsg();//这样就调用了父类的printMsg()方法
System.out.println("这是子类的"+money+"块钱");
}
}
public class Father {
public String money;//父类的钱
public void printMsg(){
System.out.println("这是父类的"+money+"块钱");
}
}
然后你看到这两个类它们有共同的方法和成员变量.
执行以下代码:
public static void main(String[] args) {
Child child = new Child();
child.printMsg();//先执行父类的printMsg();
}
结果输出:
这是父类的100块钱
这是子类的10块钱
然后你们看到Fatcher的printMsg()方法也执行了,并且是输出在了第一行.所以super.printMsg()这句话调用的是父类的方法.
这个过程是这样的.
首先分析main方法的第一句Child child = new Child();
先在堆内存创建一个child变量.然后执行到new Child();在实例化Child的时候发现它继承于Father所以先实例化Father,在堆里面生成了Father的对象引用后在在其里面生成Child的对象引用.到此第一句话执行完毕。
接着执行第二句child.printMsg().因为第一句话的引用指向了new Child();所以这个是Child的对象引用。因此执行的是Child类里面的printMsg()
接着进到方法体执行super.printMsg()。super表示父类的对象引用所以这个super就是Father,所以super.printMsg();就是执行Father类的printMsg();然后就输出 System.out.println(“这是父类的”+money+“块钱”); 这个money是在Father类里的所以输出"这是父类的100块钱".
然后回到子类的方法继续下一句System.out.println(“这是子类的”+money+“块钱”);这个money在子类Child里并且没有用super.money这样写所以就是子类的money,然后输出:这是子类的10块钱:.大致过程就是这样.
内存分布大致这样
因此,Child继承了父类. 然后你new了一个Child()对象.这样你就同时new了一个Father对象.然后此时子类和父类有相同名称的成员变量和方法.这时候你用super. 就是调用父类的方法和成员变量. 直接this. 或者省略this 就是调用子类的方法或成员变量
总结:
1,super是指父类的对象引用.当一个类继承于另一个类.比如Child继承Father.那么你在实例化一个对象并且指向子类时.即 new Child()而不是new Father()。那么这个时候this就指child,super就指father.当父子有相同名称的变量或方法时.用super.来表示使用的是父类的东西,用this.或者直接省略this表示子类的东西.
2,一般什么时候会用到super?
(1)两个类有继承关系.子类和父类有相同名称的方法和成员变量且此时需要使用父类的方法和成员变量时.用super
–>如果父类和子类没有相同名称的方法和变量. 那么就不需要写super.
–>构造方法需要调用父类的构造方法时用super()
public class Child extends Father{
public String childSize = "3";
}
public class Father {
public String fatherSize = "3";
}
比如这样的代码.你直接写fatherSize他就是Father的东西.不用刻意super.fatherSize.
但是这种情况下就没必要继承.继承的意义就是能从父类身上拿到东西。。
拓展: 有一个类,叫Object类. 所有类都继承于Object类. 就像是祖宗一样的东西. 由于所有的类都默认继承于Object类.因此每个类都能使用Object的东西
比如toString,equals等.