有如下代码:
class A
{
public void f() { System.out.println("fA”); }
public void g() { System.out.println("gA”); }
int n = 1;
}
class B extends A
{
public void f() { super.f(); System.out.println("fB”); }
public void g() { f(); System.out.println("gB”); }
int n = 2;
public static void main(String[] args)
{
A a = new B();
a.f();
a.g();
ystem.out.println(a.n);
System.out.println( ((B) a).n);
}
}
-----------------
输出结果是
fA
fB
fA
fB
gB
1
2我理解A a = new B();这条语句是形成一个新的对象,将这个对象的地址赋值给a。由于A是B的父类因此可以这样赋值
这样当执行a.f()的时候运行的是B类的f()方法。
同理a.g()的时候运行的也是B类的f()方法。
但我不明白为何输出的a.n是A类里的n=1
而((B)a).n是B类的n=2?
按理说变量a的地址是指向一个新创建的B类对象啊,a.n不应该是B类里的n=2么?java后台都做了什么?
谢谢各位啊!!!

解决方案 »

  1.   

    Java中,可对方法进行重写,但不能对变量或运算符进行重写。
      

  2.   

    java 的多态机制只是针对方法和类而不是针对变量的。
      

  3.   

    当B继承了A类后,你对父类的F()和G()进行了覆盖,也就是重写操作,所以执行的时候,java的多态性,会执行你重写后的方法。
    然而变量是不能进行重写的,所以你得到的A.N仍然是1