我想了解java中的特定代码,
package test;
public class TestDerived extends Test {
public static void main(String[] args)
{
System.out.println("Hello world");
TestDerived td = new TestDerived();
Test t = new Test();//Second call
System.out.println(td.science);
}
TestDerived()
{
super();//First call
showMyAttribute();
}
@Override
protected void showMyAttribute()
{
System.out.println(getClass().getName() + " : " + math);
}
int math = 10;
}
class Test {
Test()
{
showMyAttribute();
System.out.println("Test");
}
protected void showMyAttribute()
{
System.out.println(getClass().getName() + " : " + science);
}
int science = 9;
}
当我运行它时,我得到以下输出,
test.TestDerived : 0
Test
test.TestDerived : 10
test.Test : 9
Test
9
我还没有完全理解java的这种行为。通过查看java的属性,我觉得它与运行时多态性有关,虽然我不确定我是否正确,并且对如何生成此输出一无所知。首先,当使用构造函数super调用super方法时,它会给出值0
。然后当我在main方法中显式调用超类的构造函数时,我得到一个合适的值。稍后当我使用子类对象打印变量science
的值时,它会给出正确的值。当我使用super()从子类的构造函数调用它时,以及显式调用它时有什么区别。我需要帮助才能理解这一点。