如何覆盖main中的实例变量/方法?

时间:2013-04-28 23:30:54

标签: java inheritance

我想访问超类中的实例变量x。 我找不到它的语法。这甚至可能吗?

public class SuperBoss {
    int x = 10;
}

public class Boss extends SuperBoss {
    int x = 2;

public static void main ( String[] args ) {
    Boss b = new Boss();
    System.out.println(b.x); //prints out 2, I want it to print out 10 
}

我一直在尝试使用关键字“super”而没有成功。

6 个答案:

答案 0 :(得分:4)

打印出2,因为int x = 2Boss的声明隐藏 xSuperBoss的声明< / p>

通常,您会使用super关键字显式访问超类的public个字段,但这不会起作用于主方法的static上下文。您可以定义一个小助手函数,它将为您提供超类的值x

public class Boss extends SuperBoss {
    int x = 2;

    public int getSuperX() {
        return super.x;
    }

    public static void main ( String[] args ) {
       Boss b = new Boss();
       System.out.println(b.getSuperX()); //prints out 2, I want it to print out 10 
    }
}

答案 1 :(得分:2)

据我所知(我应该在JLS中查看详细信息),使用super访问带阴影的非私有字段是合法的,但仅限于实例方法。所以你可以这样做:

public class Boss extends SuperBoss {

    int x = 2;

    int getSuperX() {
        return super.x;
    }

    public static void main (String[] args) {
        Boss b = new Boss();
        System.out.println(b.getSuperX());
    }

}

答案 2 :(得分:1)

getSuperX()课程中添加Boss方法:

public class Boss extends SuperBoss {

    int x = 2;

    public int getSuperX() {
        return super.x;
    }

    public static void main(String[] args) {
        Boss b = new Boss();
        System.out.println(b.getSuperX());
    }
}

答案 3 :(得分:0)

发生的事情是Boss的实例变量隐藏了SuperBoss中同名的实例变量。您可以暂时将实例强制转换为超类型类:

public static void main ( String[] args ) {
    Boss boss = new Boss();
    SuperBoss superBoss = boss;
    System.out.println(boss.x); //prints 2
    System.out.println(superBoss.x); //prints 10 
}

不建议这样做。出于封装原因,您的实例变量不应该是可见的,即。应该是私人/受保护的。并且可能不应该与父类中的变量具有相同的名称。

答案 4 :(得分:0)

要做你想做的事,你需要在超类中声明xprotected,而不是试图在子类中覆盖它:

public class SuperBoss {
    protected int x = 10;
}

public class Boss extends SuperBoss {
    // int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(b.x);
    }
}

然而,在实践中,几乎不需要protected数据。它可能导致与public数据几乎一样多的问题。更好的是:

public class SuperBoss {
    private int x = 10;

    protected int getX() {
        return x;
    }
}

public class Boss extends SuperBoss {
    // int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(b.getX());
    }
}

答案 5 :(得分:0)

是的,有办法。 Fields具有编译时绑定。你需要的是SuperBoss的演员阵容:

public class SuperBoss {
    int x = 10;
}

public class Boss extends SuperBoss {
    int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(((SuperBoss)b).x);
    }
}