如何在超类中更改变量

时间:2013-09-27 18:16:53

标签: java

我想在java中编写一个程序,该程序包含三个类ABC,以便B扩展AC延伸B。每个类定义一个实例变量(名为“x”)。

如何在C中编写方法来访问并将A's x版本设置为给定值,而不更改BC's版本?

我试过super.x但事实并非如此。

任何帮助? 感谢您的提前关注

3 个答案:

答案 0 :(得分:3)

您可以像这样访问A版x

((A)this).x

只要x未在班级private中宣布A。我刚试过它。

请注意,对于字段,没有覆盖(就像方法一样)。因此,对于C类的对象,将有三个x字段,但是其中两个字段无法正常访问,因为它们被名为x的另一个字段隐藏。但是如上所述,如果没有隐藏它,那么如上所述对象将允许你获取它。

我认为在类及其子类中声明同名字段是非常糟糕的做法。这令人困惑。如果您有一个班级A并且您稍后更改A的实施并添加新的私人字段z,则可能会合法地发生这种情况;在这种情况下,可能无法确保A的子类没有字段z,因为您甚至不知道所有子类是什么(如果A是一个你公开发布的课程,例如)。我认为正是由于这个原因,Java允许你拥有相同名称的字段,以及为什么隐藏规则是它们的方式,因为它允许这样的事情在不破坏所有其他子类的情况下工作。除此之外,我建议 not 在超类和子类中使用相同名称的字段。也许如果它们都是private,那么它可能就行了。

答案 1 :(得分:2)

我误解了你的问题。你无法做你想做的事。

扩展类意味着在多个层中添加信息,最终产生一个对象。尽管存在多个层,但这并不意味着这些层彼此分开。

变量X将在一个级别定义(可能是A),之后其他类将使用此变量(如果它被声明为protected),但它们将没有自己的副本它的。您只能访问直接超类 这个类可能会为您提供对其自己的超类的额外访问权限,但您没有直接联系超级超类。

答案 2 :(得分:2)

执行以下操作

public static void main(String[] args) throws Exception {
    C c = new C();
    System.out.println("c:" + c.x);
    System.out.println("a:" + ((A)c).x);
    c.changeAX();
    System.out.println("c:" + c.x);
    System.out.println("a:" + ((A)c).x);
}

static class A {
    int x;
}

static class B extends A {
    int x;
}

static class C extends B {
    int x;

    public void changeAX() {
        ((A)this).x = 4;
    }
}

相对于声明的引用类型解析字段。以上打印

c:0
a:0
c:0
a:4

该字段必须至少具有protected个可见度。


你不想隐藏班级成员,这是不好的做法,因为它很容易混淆任何试图找出你所指的成员的人。