相信学过 Java 语言的小伙伴都熟悉 super 这个关键字,接下来,我们来研究他的一些基础用法吧。
Father 类
public class Father {
public String name;
public int age;
public Father() {}
public Father(String name, int age) {
this.name = name;
this.age = age;
System.out.println("父类构造方法调用了!");
}
public void sayHello() {
System.out.println("你好,我是"+name);
}
}
调用父类构造方法
当父类没有无参构造方法的时候,子类实例化的时候,必须显示调用父类的构造方法。
public class Child extends Father {
public Child(String name, int age) {
// 必须位于第一行。
super(name, age);
System.out.println("子类构造方法执行了");
}
}
结果:
父类构造方法调用了!
子类构造方法执行了!
为什么非得放在第一行?
子类与父类之间是继承关系,而继承就意味着得到父类中所有的成员变量和方法。既然能够得到父类的这些成员,也就意味着子类可以访问父类的方法和成员变量(前提是必须是有相应的访问权限) ,如果子类在使用父类成员的时候,父类内的成员变量没有得到正确的初始化,那么就会发生意想不到的错误。这就得保证父类得到了正确的初始化,而父类正确的初始化就离不开父类的构造函数,super 存在的意义也正是如此。
调用父类成员方法和成员变量(非私有)
super 关键字可以用来访问父类的成员方法或变量,当子类成员变量或方法与父类有相同的名字时也会覆盖父类的成员变量或方法,这个时候要想访问父类的成员变量或方法只能通过 super 关键字来访问。
public class Child extends Father {
public Child(String name, int age) {
super(name, age);
System.out.println("子类构造方法执行了!");
}
public void sayHello() {
super.sayHello();
System.out.println("父亲的年龄:"+super.age);
System.out.println("调用父类的方法,获取了父类的属性!");
}
}
结果:
你好,我是feige
父亲的年龄:23
调用父类的方法,获取了父类的属性!