我想在java中编写一个程序,该程序包含三个类A
,B
和C
,以便B
扩展A
和C
延伸B
。每个类定义一个实例变量(名为“x”)。
如何在C
中编写方法来访问并将A's
x版本设置为给定值,而不更改B
或C's
版本?
我试过super.x
但事实并非如此。
任何帮助? 感谢您的提前关注
答案 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
个可见度。
你不想隐藏班级成员,这是不好的做法,因为它很容易混淆任何试图找出你所指的成员的人。