1
class Base
{
        int x=1;
    void show()
    {
        System.out.println(x);
    }
}
class Child extends Base
{
    int x=2;
    public static void main(String s[])
    {
        Child c=new Child();
        c.show();
    }
}

OUTPUT 为 1。方法 show 是在 Base 类中继承的,但应优先考虑局部变量,因此输出应为 2 还是编译器隐式在 super 之前添加前缀?

4

4 回答 4

2

不,这是因为 Child 没有覆盖 show() 方法。唯一可用的是来自 Base 的那个,它显示了它的 x 版本。

试试这种方式 - 它会显示 2:

class Base
{
        int x=1;
    void show()
    {
        System.out.println(x);
    }
}
class Child extends Base
{
    int x=2;
    public static void main(String s[])
    {
        Child c=new Child();
        c.show();
    }
    void show()
    {
        System.out.println(x);
    }
}
于 2013-11-25T15:57:28.577 回答
1

由于您没有覆盖 中的show方法Child,因此Base将使用 ' 版本。因此它看不到x您在 中定义的变量Child。您的 IDE(如果您正在使用)应该会警告您“隐藏字段”。

x您可以通过在实例化Child对象后设置对象来实现预期的功能。尝试:

class Base
{
    int x = 1;

    void show() {        
        System.out.println(x);
    }
}

class Child extends Base
{
    public static void main(String s[]) {

        Child c = new Child();

        c.show();
        c.x = 2;
        c.show();
    }     
}

这应该产生 1,然后是 2。

编辑:请注意,仅当该x字段可从main函数访问时才有效。

于 2013-11-25T16:21:59.753 回答
1

使用一种显示方法

class Child extends Base
{
    public Child(int x)
    {
        super(x); // Assumes a constructor in the parent that accepts an int.
        // or
        super.x = x;
    }
}

那么你只需要一种show()方法。

有两种显示方法

您可以在其子类中覆盖超类的功能,如下所示:

class Child extends Base
{
    public void show()  
    {
       // OVerrides the code in the superclass.
       System.out.println(x);
    }
}

你应该更喜欢哪个?

您正在尝试覆盖功能,因此您应该支持第二个选项。

于 2013-11-25T15:59:47.217 回答
0

Base类不知道Child类,所以该show()方法永远不会从它的子类中调用变量。

因此,如果您想显示x来自子类的show()方法,请通过在类中重新实现它来覆盖该方法Child

于 2013-11-25T15:59:10.800 回答