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中的方法存储在方法区中,而方法区是位于哪段内存的?静态方法也是位于这段内存吗?求比较详细深入的解释

解决方案 »

  1.   


    方法aa()是静态方法,是属于类A的方法。
      

  2.   

    去掉STATIC 关键字.看看结果是什么?
    STATIC 的方法是不能重写的.
    可以继续研究一下重写的规则.
      

  3.   

    Static methods belong to the class.obj.aa();
    is equivalent to
    A.aa();because obj is a class A reference variable.
      

  4.   

    基于安全考虑,java不允许直接访问内存,我想这个问题是没有意义的
      

  5.   

    方法是放在栈上的,java中只有栈和堆的概念,而且是不可操作的,全部交给jvm来处理,因为aa()是一个static方法,obj是一个A的引用变量,所以编译器是A.aa()这样调用的
      

  6.   

    A obj = new B();
      obj.aa();
    A类的引用指向的还是A类的地址
    不知道这样解释对不对~
      

  7.   

    A obj = new B();
      obj.aa();
    A类的引用指向的还是A类的地址
    不知道这样解释对不对~
    =========================
    obj是一个A类型的引用变量,在java中引用变量的类型永远不能改变, new B()创建了一个B的对象,obj指向这个B对象.超类类型的引用变量可以引用子类对象.
      

  8.   

    和什么地址无关
    因为是静态方法,
    A obj = new B();虽然内容是B,但是定义的类型是A,
    对于静态方法来说,obj.aa()和A.aa()是一个意思。
    所以会这样。LZ还可以做你更不可思议的测试:
    A obj = null;
      obj.aa();不会出现空指针错误,结果也是11111111111111