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

一道简单的多态问题
public   class   A   {

  public   static   void   aa()
  {
    System.out.println( "11111111111111 ");
  }
}


public   class   B   extends   A{
 
 
  public   static   void   aa()
  {
    System.out.println( "22222222222 ");
  }
 
  public   static   void   main(String[]   args)
  {
    A   obj   =   new   B();
    obj.aa();
  }
}


请问结果为什么是11111111111111?

另求教:java中的方法存储在方法区中,而方法区是位于哪段内存的?静态方法也是位于这段内存吗?求比较详细深入的解释


------解决方案--------------------

方法aa()是静态方法,是属于类A的方法。
------解决方案--------------------
去掉STATIC 关键字.看看结果是什么?
STATIC 的方法是不能重写的.
可以继续研究一下重写的规则.
------解决方案--------------------
Static methods belong to the class.

obj.aa();
is equivalent to
A.aa();

because obj is a class A reference variable.
------解决方案--------------------
表态方法不是动态邦定的,也就无所谓的多态

------解决方案--------------------
基于安全考虑,java不允许直接访问内存,我想这个问题是没有意义的
------解决方案--------------------
方法是放在栈上的,java中只有栈和堆的概念,而且是不可操作的,全部交给jvm来处理,因为aa()是一个static方法,obj是一个A的引用变量,所以编译器是A.aa()这样调用的

------解决方案--------------------
A obj = new B();
obj.aa();
A类的引用指向的还是A类的地址
不知道这样解释对不对~
------解决方案--------------------
static的方法不能被重写
------解决方案--------------------
A obj = new B();
obj.aa();
A类的引用指向的还是A类的地址
不知道这样解释对不对~
=========================
obj是一个A类型的引用变量,在java中引用变量的类型永远不能改变, new B()创建了一个B的对象,obj指向这个B对象.超类类型的引用变量可以引用子类对象.
------解决方案--------------------
和什么地址无关
因为是静态方法,
A obj = new B();

虽然内容是B,但是定义的类型是A,
对于静态方法来说,obj.aa()和A.aa()是一个意思。
所以会这样。

LZ还可以做你更不可思议的测试:
A obj = null;
obj.aa();

不会出现空指针错误,结果也是11111111111111