在Java中使用super()?

时间:2016-11-13 16:19:51

标签: java oop

我正在尝试学习java oop,当我提出一些例子时,我发现了解超级方法的使用时遇到的一些问题。请检查下面的代码。

你可以告诉我为什么超级();方法没有引用superClass?我不明白。

superClass:

package javaapplication;

public class A {

    protected String val;

    public A(){

        this.val = " Class A ";
    }
}

subClass

package javaapplication;


public class B extends A {


    public B(){

         this.val = " Class B";
         System.out.println(super.val);


    }
}

主类

package javaapplication;

public class JavaApplication {

    public static void main(String[] args) {

        B a = new B();


    }

}

输出:运行:B类

为什么我得到“B级”?

3 个答案:

答案 0 :(得分:7)

因为只有一个val变量,而您的B构造函数将其设置为" B级"。

您可以使用super.something来引用超类而不是当前类的something(成员变量或方法),但只有当两个类都声明something时,它们才会不同。在这种情况下,AB共享val定义的A

答案 1 :(得分:1)

Java中的构造函数(现在专注于B类的构造函数)如果明确告诉你使用this(arguments...)或者超类A的构造函数,那么ALWAYS会调用另一个B类构造函数告诉您使用super(arguments...)执行此操作,或者如果您未指定对其他构造函数的任何调用,则会调用super()。这个调用是任何构造函数的第一条指令。除非你所说的课程是对象。

首先调用A构造函数,将val设置为" Class A"但是然后B类的构造函数继续擦除该值并将其替换为" Class B"。

尽管有关构造函数如何工作的一个很好的例子,但实质上是糟糕的编程,因为这不是你要做的。一个优秀的程序员会在A类中添加一个接受val值的contstructor,在B类中你可以使用super(" Class B")来调用它,而val将是在A类中定义的私有变量。

请注意,因为类B扩展了类A,所以类B的任何实例都具有在类B和类A中定义的属性,因此super.val或this.val正在引用完全相同的变量。可以在B类中添加一个新的变量val,但这又是糟糕的编程,如果编译器接受这个,我不确定。

答案 2 :(得分:1)

当执行B a = new B(); B的构造函数时,执行内部调用基类构造函数作为第一个操作。因此,它将变量val的值设置为Class A。但是,您手动执行this.val = Class B,将值再次设置为Class B

只需从构造函数B中注释掉this.val = Class B,它就会打印Class A