【问题标题】:use super () in Java?在Java中使用super()?
【发布时间】:2016-11-13 16:19:50
【问题描述】:

我正在尝试学习 java oop,但当我做一些示例时,我发现在理解 super 方法的使用方面存在一些问题。请检查下面的代码。

你能告诉我为什么 super();方法不引用超类?我不明白。

超类:

package javaapplication;

public class A {

    protected String val;

    public A(){

        this.val = " Class A ";
    }
}

子类

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级”?

【问题讨论】:

  • 因为您在B 构造函数中将其分配给Class B?你期待什么? val 在两个类中都是一样的。
  • 你期望输出什么?
  • When do I use super()?的可能重复
  • super.methodA() 的行为与 super.variableA 不同。 变量没有覆盖,因此只有一个副本

标签: java oop


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Java 中的构造函数(现在专注于 B 类的构造函数)如果您明确告诉您使用 this(arguments...) 这样做,则始终调用 B 类的另一个构造函数,或者如果您明确告诉您,则调用超类 A 的构造函数使用super(arguments...) 执行此操作,或者如果您没有指定对另一个构造函数的任何调用,它会调用super()。而这个调用是任何构造函数的第一条指令。除非你说的类是 Object。

    所以首先调用了 A 构造函数,将 val 设置为“A 类”,然后 B 类的构造函数不断擦除该值并将其替换为“B 类”。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2015-11-07
        • 2023-03-10
        • 1970-01-01
        • 2018-05-30
        相关资源
        最近更新 更多