2017-10-10 109 views
-2

关于继承和方法覆盖,我有以下练习,问题是为什么调用父类中'initialize()'方法中的'System.out.println(f1)'与参数'0',并且需要做什么将被称为参数'6'。请帮我理解它。提前致谢。Java继承和方法重写程序

public class Solution { 
public static void main(String[] args) { 
    new B(6); 
} 

public static class A { 
    private int f1 = 7; 

    public A(int f1) { 
     this.f1 = f1; 
     initialize(); 
    } 

    protected void initialize() { 
     System.out.println(f1); 
    } 
} 

public static class B extends A { 
    protected int f1 = 3; 

    public B(int f1) { 
     super(f1); 
     this.f1 += f1; 
     initialize(); 
    } 

    protected void initialize() { 
     System.out.println(f1); 
    } 
} 

}

+2

' initialize'没有*任何参数...并且你不会在'B'中重写它,因为它是一个私有方法。目前还不清楚你的期望以及为什么,说实话 - 但是你有两个同名的领域只会增加混乱。 –

回答

0

Privare方法不能被覆写。您可以在子代中编写该方法,但实际上它不是压倒性的

从Java语言规范JLS

请注意,在这些术语的技术意义上,私有方法不能被隐藏或覆盖。这意味着子类可以在其一个超类中声明一个与私有方法具有相同签名的方法,并且不要求此类方法的返回类型或抛出子句与私有方法的返回类型或抛出子句具有任何关系超类。

你的父类的方法是没有得到调用参数值0。如果你能看到父类的构造是压倒一切的价值this.f1=f1f1值将是6。因此输出将是6和9

+0

感谢JLS链接,它不仅帮助我做了很多练习! –