在java中重写变量
我得到了输出B3。为什么它不把b13作为输出。谁能解释一下。在在java中重写变量,java,overriding,Java,Overriding,我得到了输出B3。为什么它不把b13作为输出。谁能解释一下。在Foo类中声明public int a=8而不是Bar类它应该工作。。。打印B3 但是我想您讨论的是Java认证考试中包含的一个问题,因此您必须更正Foo类的代码,添加public int a=3 不能在Java中重写变量,但在超类中声明为public(或protected)也可以在所有继承的类中使用它 在这种情况下,右边的输出是B13,因为在测试类中,您使用Bar对象作为Foo对象,因此a的值是3而不是8,假设类Foo声明如下 pu
Foo
类中声明public int a=8
而不是Bar
类它应该工作。。。打印B3
但是我想您讨论的是Java认证考试中包含的一个问题,因此您必须更正Foo
类的代码,添加public int a=3
不能在Java中重写变量,但在超类中声明为public
(或protected
)也可以在所有继承的类中使用它
在这种情况下,右边的输出是B13,因为在测试类中,您使用
Bar
对象作为Foo
对象,因此a
的值是3而不是8,假设类Foo声明如下
public class Test {
public static void main(String args[]){
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
}
}
class Foo {
public void addFive() {
a += 5; System.out.print("f ");
}
}
请参见链接我假设您是想在类
Foo
中声明一个整数字段a
正如其他人所指出的,你的问题的答案与“覆盖”和“隐藏”的概念有关。另一种解释方法是,对于成员变量,没有“动态分派”这样的东西。这意味着,如果您访问某个对象的成员,系统将在运行时通过查看类层次结构来检查您所指的成员
因此,在运行时调用方法f.addFive
时,系统将看到您的对象实际上是一个Bar
,而不是Foo
,因此使用您在Bar
类中定义的addFive
函数
成员变量不会发生这种情况:您在print语句中访问f.a
,在编译时,您决定在那里访问classFoo
中声明的字段a
,因此,这就是运行时将发生的情况
现在,没有成员变量访问的动态分派的原因是性能:每次您只想给成员变量添加一些值时,都需要花费很高的代价来遍历整个“查看这到底是什么对象”逻辑。请在代码中使用适当的间距。Java中无法重写变量。您的代码未编译,因为在类
Foo
中未定义变量a
。请更正您的代码。此代码甚至不可编译。编写时,您的代码不可编译。Foo中不存在a。@prerna我想您正在学习Java认证:)如果是,那么您发布的代码中存在错误。你忘了把public int a=3代码>在Foo
类中。
public class Test {
public static void main(String args[]){
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
}
}
class Foo
{
public int a = 3;
public void addFive()
{
a += 5;
System.out.print("f ");
}
}
class Foo {
public void addFive() {
a += 5; System.out.print("f ");
}
}
class Foo {
public int a;
public void addFive() {
a += 5; System.out.print("f ");
}
}