在Java中使用super()吗?
我正在尝试学习java oop,当我做一些示例时,我发现理解超级方法的使用有一些问题。请检查下面的代码 你能告诉我为什么会这样吗;方法不引用超类?我不明白 超类:在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
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,但这同样是一个糟糕的编程,如果编译器接受这一点,我不确定执行B的code>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的行为不同。变量没有重写,因此只有一个副本