繁体   English   中英

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

[英]How to override instance variables/methods in main?

我想访问超类中的实例变量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 
}

我一直试图使用关键字“超级”但没有成功。

它输出2因为你在Boss声明int x = 2 隐藏SuperBossx的声明

通常,您将使用super关键字显式访问超类的public字段,但这不会起作用于main方法的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 
    }
}

据我所知(我应该在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());
    }

}

Boss类中添加getSuperX()方法:

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());
    }
}

发生的事情是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 
}

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

要做你想做的事,你需要在超类中声明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());
    }
}

是的,有一种方法。 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM