一道简单的多态问题
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