在java中,子类继承父类,一般会用到super关键字,下面我们介绍super的使用。
目录
2.如果没有显示地调用父类的构造方法,会默认调用父类的无参构造方法
3.可以使用super关键字来显示调用父类的构造方法(一定要放在构造器第一行)
一、子类构造方法中super的使用
1.调用子类的构造方法之前,会先调用父类的构造方法
举例:
我们在一个包下同时建两个文件一个为Fu.java,另一个为Test.java
编写Fu.java文件:
package com.syc.test;
public class Fu {
public Fu(){
System.out.println("父类的无参构造器");
}
}
class Zi extends Fu{
public Zi(){
System.out.println("子类的无参构造器");
}
}
Test.java文件:
package com.syc.test;
public class Test {
public static void main(String[] args) {
new Zi();
}
}
运行结果:
说明在调用子类的构造方法前,先调用了父类的构造方法,此时相当于在子类的构造方法里面的第一行有一句super();
2.如果没有显示地调用父类的构造方法,会默认调用父类的无参构造方法
举例:
我们修改Fu.java文件为:
package com.syc.test;
public class Fu {
public Fu(){
System.out.println("父类的无参构造器");
}
public Fu(int a){
System.out.println("父类中带有一个int型参数的构造器");
}
}
class Zi extends Fu{
public Zi(){
System.out.println("子类的无参构造器");
}
public Zi(int a){
System.out.println("子类中带有一个int型参数的构造器");
}
}
Test.java为:
package com.syc.test;
public class Test {
public static void main(String[] args) {
new Zi(10);
}
}
运行结果:
说明:此时相当于在public Zi(int a)这个构造器中的第一行有一句super();
3.可以使用super关键字来显示调用父类的构造方法(一定要放在构造器第一行)
若我们修改Fu.java文件,在其中添加进super(20);语句,即:
继续运行上述文件,运行结果为:
二、子类对象实例化过程
- 创建子类对象时,先调用父类构造器(默认情况下,隐式调用无参构造器),后调用子类构造器
- 创建子类对象时,会先按照其父类的信息开辟空间,然后如果有新增的属性或者方法,再继续分配
用一张图来说明就是:
三、子类实例方法中super的使用
在子类的实例方法中,若方法名/变量和父类相同时,会重写父类的方法/隐藏父类的变量,若此时我们想访问父类的变量或者方法,可以使用super关键字,调用父类的方法和属性。
语法为:super.函数名(参数列表)/ super.属性、
如下,我们新建Fu类:
package com.syc.test;
public class Fu {
public int a = 10;
public void fun(){
System.out.println("Fu fun");
}
}
class Zi extends Fu{
public int a = 200;
@Override
public void fun(){
System.out.println("重写的fun方法");
}
public void test(){
System.out.println(super.a);//调用父类被隐藏的变量
super.fun();//调用父类被覆盖的方法
}
}
测试类为Test.java:
package com.syc.test;
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
System.out.println(zi.a);
zi.fun();
zi.test();
}
}
四、this与super的比较
- 调用构造器:this(参数)调用的是本类重载的其他构造器,super(参数)调用的是父类的构造器
- 调用成员:this.调用的是本类的成员,super.调用的是父类的成员
- this发生在本类中,super发生在继承关系中
- this和super都必须在构造器第一行的位置,不能同时出现
我们新建一个com.syc.test包中的People类代码如下,用此例来说明this和super的调用过程:
package com.syc.test;
public class People {
public int age;
public People(){
System.out.println("父类无参构造器");
}
public People(int age){
this();
System.out.println("父类有参构造器");
this.age = age;//通过this调用本类中的成员
}
}
class Teacher extends People{
public String name;
public Teacher(){
super(10);
System.out.println("子类无参构造器");
}
public Teacher(String name){
System.out.println("子类有参构造器");
this.name = name;//通过this.调用本类中的成员
super.age = 100;//通过super.调用父类中的成员
}
}
我们在测试类中进行测试:
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
}
}
运行结果为: