我正在尝试学习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级”?
答案 0 :(得分:7)
因为只有一个val
变量,而您的B
构造函数将其设置为" B级"。
您可以使用super.something
来引用超类而不是当前类的something
(成员变量或方法),但只有当两个类都声明something
时,它们才会不同。在这种情况下,A
和B
共享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