大佬们,super()调用父类的构造器怎么理解?

时间:2021-02-24 19:32:09
例如下面这样的,

public class GetClassTest001 {
public static void main(String[] args) {
A a = new A();
B b = new B();
}
}

class A {
public A(){//无参的构造方法
System.out.println("getClass()=="+this.getClass()); //A                     1
}
}

class B extends A
{
public B(){
super();                                                                               //B                          2
System.out.println("getClass()=="+this.getClass());  //B                              3
}
}

输出为:
getClass()==class edu.bjtu.day.A
getClass()==class edu.bjtu.day.B
getClass()==class edu.bjtu.day.B

我看网上说,这个地方super()方法的作用就是调用父类的构造方法,它的含义是什么呢?
我的理解就是在super()语句所在的位置执行一遍父类构造方法中的语句,不知道这样理解对不对啊各位大神。
一开始我很疑惑为什么2的位置输出的是B而不是A,感觉这么想就能解释通了。

4 个解决方案

#1


super()调用父类的构造方法, 如果父类是无参构造函数可以 不写这句, 自动会调用
为什么是B而不是A, 其实很简单,是子类调用父类的方法,而不是父类
运行这个程序,就懂了

class Base{
public Base() {
System.out.println(this);
}
}

class Sub extends Base{
public Sub() {
System.out.println(this);
}
}
public class Test{
public static void main (String args[]) {
new Base();
new Sub();
}
}

#2


每个类都有一个或多个构造函数,用来在创建时进行初始化。
每个构造函数都会在最开始调用其父类,如果没有手动调用,系统会帮你自动调用一个空参的父类构造函数(也就是super();)
你这例子里,创建A调用了A的构造函数,输出getClass()==A。之后创建B,调用B的构造函数,B的构造函数的第一句是super()调用父类A的构造函数,输出其所属类getClass()==B,第二句也是输出其所属类getClass()==B。

写了些更为简约的代码可供参考理解:

public class Test2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}

class Fu{
Fu(){
System.out.println("Fu show nothing");
}

Fu(int i){
System.out.println("Fu show:"+i);
}
}

class Zi extends Fu{
Zi(){
//super();//不手写调用父类的构造函数,系统会自动调用一个空参的父类构造函数
System.out.println("Zi show nothing");
}
}


输出结果:
Fu show nothing
Zi show nothing




public class Test2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}

class Fu{
Fu(){
System.out.println("Fu show nothing");
}

Fu(int i){
System.out.println("Fu show:"+i);
}
}

class Zi extends Fu{
Zi(){
super(1);//手写调用父类的构造函数,就会调用对应的父类构造函数
System.out.println("Zi show nothing");
}
}


输出结果:
Fu show:1
Zi show nothing

#3


super();这是访问父类的构造方法,而父类构造方法里面的this,还是子类本身,所以第二行打印的是B

#4


第二行你调用super(),它会去执行父类A的构造方法,但由于你在B类里调用,创建的是B对象,this是指当前类实例对象,所以结果为B

#1


super()调用父类的构造方法, 如果父类是无参构造函数可以 不写这句, 自动会调用
为什么是B而不是A, 其实很简单,是子类调用父类的方法,而不是父类
运行这个程序,就懂了

class Base{
public Base() {
System.out.println(this);
}
}

class Sub extends Base{
public Sub() {
System.out.println(this);
}
}
public class Test{
public static void main (String args[]) {
new Base();
new Sub();
}
}

#2


每个类都有一个或多个构造函数,用来在创建时进行初始化。
每个构造函数都会在最开始调用其父类,如果没有手动调用,系统会帮你自动调用一个空参的父类构造函数(也就是super();)
你这例子里,创建A调用了A的构造函数,输出getClass()==A。之后创建B,调用B的构造函数,B的构造函数的第一句是super()调用父类A的构造函数,输出其所属类getClass()==B,第二句也是输出其所属类getClass()==B。

写了些更为简约的代码可供参考理解:

public class Test2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}

class Fu{
Fu(){
System.out.println("Fu show nothing");
}

Fu(int i){
System.out.println("Fu show:"+i);
}
}

class Zi extends Fu{
Zi(){
//super();//不手写调用父类的构造函数,系统会自动调用一个空参的父类构造函数
System.out.println("Zi show nothing");
}
}


输出结果:
Fu show nothing
Zi show nothing




public class Test2 {
public static void main(String[] args) {
Zi z = new Zi();
}
}

class Fu{
Fu(){
System.out.println("Fu show nothing");
}

Fu(int i){
System.out.println("Fu show:"+i);
}
}

class Zi extends Fu{
Zi(){
super(1);//手写调用父类的构造函数,就会调用对应的父类构造函数
System.out.println("Zi show nothing");
}
}


输出结果:
Fu show:1
Zi show nothing

#3


super();这是访问父类的构造方法,而父类构造方法里面的this,还是子类本身,所以第二行打印的是B

#4


第二行你调用super(),它会去执行父类A的构造方法,但由于你在B类里调用,创建的是B对象,this是指当前类实例对象,所以结果为B