美文网首页Java
2019-03-07 Java super

2019-03-07 Java super

作者: yangsunior | 来源:发表于2019-03-07 19:34 被阅读0次

super

  • super 代表一个父类空间。

  • 当本类的成员和局部变量同名用this区分;
    当子父类中的成员变量同名用super区分父类。

  • 问:子类构造对象时发现访问子类构造函数时,父类也运行了,为什么?
    原因是:在子类的构造函数中第一行有一个默认的隐式语句。 super();
    子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。

  • 问:为什么子类实例化的时候要访问父类中的构造函数呢?
    子类继承了父类,获取到了父类中内容(属性)。在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。
    所以,子类在构造对象时必须访问父类中的构造函数。

  • 问:子类的构造函数中加入了super()语句
    如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中哪个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义第一行。所以只能有一个。

    注:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。

super实例代码分析

1. 子类默认使用super() 调用父类构造器

public class AJavaTest{
      public static void main(String args[]) {
            new AJavaTestZi();
      }
}
class AJavaTestFu {
      int num;
      
      AJavaTestFu() {
            num = 10;
            System.out.println("Fu 001: " + num);
      }
      
      AJavaTestFu(int num) {
            System.out.println("Fu 002: " + num);
      }
}
class AJavaTestZi extends AJavaTestFu {
      int num;
      AJavaTestZi()
      {
//          super();//调用的就是父类中的空参数的构造函数。
            
            System.out.println("AJavaTestZi 001");
      }
}

OUTPUT:

Fu 001: 10
AJavaTestZi 001

2. this()

public class AJavaTest{
      public static void main(String args[]) {
            new AJavaTestZi(25);
      }
}
class AJavaTestFu {
      int num;
      
      AJavaTestFu() {
            num = 10;
            System.out.println("Fu 001: " + num);
      }
      
      AJavaTestFu(int num) {
            System.out.println("Fu 002: " + num);
      }
}
class AJavaTestZi extends AJavaTestFu {
      int num;
      AJavaTestZi()
      {
//          super();//调用的就是父类中的空参数的构造函数。
            
            System.out.println("AJavaTestZi 001");
      }
      
      AJavaTestZi(int x)
      {
            this();
            System.out.println("AJavaTestZi 002: "+x);
      }
}

OUTPUT:

Fu 001: 10
AJavaTestZi 001
AJavaTestZi 002: 25

3. 将this()改为super()

public class AJavaTest{
      public static void main(String args[]) {
            new AJavaTestZi(25);
      }
}
class AJavaTestFu {
      int num;
      
      AJavaTestFu() {
            num = 10;
            System.out.println("Fu 001: " + num);
      }
      
      AJavaTestFu(int num) {
            System.out.println("Fu 002: " + num);
      }
}
class AJavaTestZi extends AJavaTestFu {
      int num;
      AJavaTestZi()
      {
//          super();//调用的就是父类中的空参数的构造函数。
            
            System.out.println("AJavaTestZi 001");
      }
      
      AJavaTestZi(int x)
      {
            super();
            System.out.println("AJavaTestZi 002: "+x);
      }

    等同于
      AJavaTestZi(int x)
      {
            System.out.println("AJavaTestZi 002: "+x);
      }
}

OUTPUT:

Fu 001: 10
AJavaTestZi 002: 25

4. 将super()改为super(30)

public class AJavaTest{
      public static void main(String args[]) {
            new AJavaTestZi(25);
      }
}
class AJavaTestFu {
      int num;
      
      AJavaTestFu() {
            num = 10;
            System.out.println("Fu 001: " + num);
      }
      
      AJavaTestFu(int num) {
            System.out.println("Fu 002: " + num);
      }
}
class AJavaTestZi extends AJavaTestFu {
      int num;
      AJavaTestZi()
      {
//          super();//调用的就是父类中的空参数的构造函数。
            
            System.out.println("AJavaTestZi 001");
      }
      
      AJavaTestZi(int x)
      {
            super(30);
            System.out.println("AJavaTestZi 002: "+x);
      }
}

OUTPUT:

Fu 002: 30
AJavaTestZi 002: 25

父类无参构造器不会再被调用。

相关文章

网友评论

    本文标题:2019-03-07 Java super

    本文链接:https://www.haomeiwen.com/subject/plbhpqtx.html