Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用super()吗?_Java_Oop - Fatal编程技术网

在Java中使用super()吗?

在Java中使用super()吗?,java,oop,Java,Oop,我正在尝试学习java oop,当我做一些示例时,我发现理解超级方法的使用有一些问题。请检查下面的代码 你能告诉我为什么会这样吗;方法不引用超类?我不明白 超类: package javaapplication; public class A { protected String val; public A(){ this.val = " Class A "; } } 子类 package javaapplication; public cl

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

你能告诉我为什么会这样吗;方法不引用超类?我不明白

超类:

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

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

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

定义的
val
,Java中的构造函数(现在关注类B的构造函数)总是调用类B的另一个构造函数,如果您明确告诉您使用
这个(参数…)
或超级类a的构造函数,如果您明确告诉您使用
super(参数…
),或者如果您没有指定对它调用的另一个构造函数的调用
super()
。这个调用是任何构造函数的第一条指令。除非你所说的类是对象

因此,首先调用A构造函数,将val设置为“Class A”,然后B类的构造函数继续擦除该值并将其替换为“Class B”

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


请注意,由于类B扩展了类A,因此类B的任何实例都具有在类B和类A中定义的属性,因此super.val或this.val引用的变量完全相同。我们可以在类B中添加一个新变量val,但这同样是一个糟糕的编程,如果编译器接受这一点,我不确定constructor,它在内部调用基类构造函数作为第一个操作。因此,这将变量val的值设置为
class A
。但是您正在手动执行
this.val=Class B
,它将值再次设置为
Class B


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

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