日期:2014-05-20  浏览次数:20737 次

谁来给我祥解下这个程序??谢拉
class   A
{
      int   i=1;
      char   f(){return 'A ';}
      static   char   g(){return 'A ';}
}
class   B   extends   A
{
      int   i=2;
      char   f(){return 'B ';}
      static   char   g(){return 'B ';}
}
public   class   Test
{
      public   static   void   main(String[]   args)
      {
            B   b=new   B();
            System.out.println(b.i);
            System.out.println(b.f());
            System.out.println(b.g());
            System.out.println(B.g());
            A   a=b;
            System.out.println(a.i);
            System.out.println(a.f());
            System.out.println(a.g());
            System.out.println(A.g());
      }
}
程序运行结果:
2
B
B
B
1
B
A
A
主要说下程序为什么是这个输出顺序,谢谢大虾了!!!

------解决方案--------------------
跟顺序没什么关系吧....
System.out.println(b.i);//b声明类型是B,所以调用类B的实例域i
System.out.println(b.f());//动态绑定,b实际类型是B,所以调用类B的f()
System.out.println(b.g());//由于是static,所以是静态绑定,等同于B.g()
System.out.println(B.g());

System.out.println(a.i);//a声明类型是A,所以调用A的实例域i
System.out.println(a.f());//动态绑定,a的实际类型是B,所以调用类B的f()
System.out.println(a.g());//静态绑定,等同于A.g()
System.out.println(A.g());

只用非final,static,private的方法才采用动态绑定
------解决方案--------------------
着急上厕所,先留个名
------解决方案--------------------
B b=new B();
System.out.println(b.i); ------------2
System.out.println(b.f()); ------------B
System.out.println(b.g()); ------------B
System.out.println(B.g()); ------------B
前面的比较好理解。就不说了.下面部分 是 父类引用和子类对象的关系
A a=b;
System.out.println(a.i); ------------1
System.out.println(a.f()); ------------B 因为f()方法被覆盖了.所以调用子类
System.out.println(a.g()); ------------A 因为g() 是静态的,所以不受影响
System.out.println(A.g()); ------------A 同上

个人理解是这个样子的.> ~
------解决方案--------------------
最通俗的理解:

A a = b;

等式左边的引用变量决定访问域的权限
等式右边的对象类型决定最终动态绑定执行的具体方法
但是如果基类的方法是static,final,private词修饰,子类就不能重写基类的方法,就不能实现多态,等式左边的引用变量就只能访问基类的静态方法。

这是我个人理解方法,如有雷同,纯属巧合!
------解决方案--------------------
java中的多态是针对java中的方法来说的,
类中的域不受影响,
所以什么类型的引用就会去引用相应类中的域.
------解决方案--------------------
静态方法一直不是很懂啊..