Java中隐藏的静态方法
当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题作进一步解释吗。我真的不明白为什么我得到的是30分而不是10分。谢谢Java中隐藏的静态方法,java,static,Java,Static,当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题作进一步解释吗。我真的不明白为什么我得到的是30分而不是10分。谢谢 class One { static int value = 0; One(){ addValue (); } static int addValue () { return v
class One {
static int value = 0;
One(){
addValue ();
}
static int addValue () {
return value+=10;
}
int getValue () {
return value;
}
}
class Two extends One {
Two () {
addValue ();
}
static int addValue () {
return value+=20;
}
public static void main(String[] args ) {
One t = new Two ();
System.out.println(t.getValue());
}
}
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对该超类的无参数构造函数的调用。引用: 如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,所以如果对象是唯一的超类,就没有问题了 在本例中,您正在调用类
Two
的构造函数,该构造函数默认调用类One
的构造函数,该构造函数定义了方法调用addValue
,将值添加10
所以现在value=10
。然后,调用类Two
的addValue
方法,将20
添加到值中。因此,最后您将获得value=20+10=30
作为输出。当您在创建类2的实例时尝试最初运行此程序时,在其构造函数中有一个语句“super()”,它由编译器自动调用超类构造函数。因此,首先变量'value'的值是10,然后它增加20。最后,它的值是30,结果就是30
以下是编译器处理的代码:
Two () {
super(); // Automatically invoked by compiler
addValue ();
}
您正在调用两个类的构造函数。但是当您隐式调用它时,您的单类构造函数将被调用。因此,它将把10
添加到您的值变量中,然后它将调用该类中的Two构造函数
和`addValue方法。因此,它将在您的值变量中再添加20。所以答案是30。两类构造函数首先调用超级类(一)构造函数
在自己的类中调用addValue()。这会将值加10(0+10=10)
当一个人的构造器完成时,两个人的构造器开始。然后两个函数调用addValue()本身。这又增加了20,使值字段(由于继承,由1和2共享)总数达到30。谢谢你们,这很有帮助。@laurenimad不客气