当前位置:编程学习 > JAVA >>

java多态从内存模型

--------------------编程问答-------------------- 自己顶起!!! --------------------编程问答-------------------- "引言:"后面一段话都是糊涂的认识。和你讨论可能会话语不一致。 --------------------编程问答-------------------- "java的8种基本数据类型与变量名(引用变量)会存储在堆栈中" —— 说法是错误的。

“为什么p不能访问到Son的特有方法” —— 不是因为访问不到,而是因为先人为规定其不能访问,然后jvm就做出这样的限制。 --------------------编程问答--------------------
引用 2 楼 yqj2065 的回复:
"引言:"后面一段话都是糊涂的认识。和你讨论可能会话语不一致。

我也不知道是不是这样的,但是这个认识我是通过http://blog.sina.com.cn/s/blog_541896910100uw12.html
得来(在这篇文章的中间位置)"栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄",感觉很正解啊…… --------------------编程问答-------------------- 语言层面限制吧 能调用哪个方法是由编译时决定的,如果是被覆盖的方法,就会dynamic dispatch --------------------编程问答-------------------- 一个实例中会有各种数据类型,例
class instance{
int age = 0;
String name = "";
……
}

那么当你需要
instance tan = new instance();
时其中的int age并不是保存在栈中,而是在堆里面。
在这里谢谢ticmy 与 yqj2065两位指出错误。
“引言:java的8种基本数据类型与变量名(引用变量)会存储在堆栈中,而对象则存储在堆内。”
应该是这样说“栈里面保存8种基本数据类型与引用变量”。前面那一句话的意思是,8种基本数据类型只能保存在栈中,所以这句是错的。
   1,对象中的基本数据类型与引用保存在堆内存中,那什么地方的基本数据类型与引用变量才保存在栈里,是main方法里的吗?
   2,还有我们可以在main方法所在的类中有定义其它的静态方法,方法中有基本数据类型。在通过Class.method()方式调用这个方法,那方法中的数据是怎么保存的?
   3,但是还另一种情况,new出main所在类,例如: 
Mainclass m = new MainClass();

那么这时候,main中的基本数据类型保存在那里? --------------------编程问答-------------------- 本地变量(local variables)都是在栈中生成,main中基本数据类型属于本地变量吧?
实例变量(instance variables)在堆中生成



可以看这个例子


public static void main(String args[]){
 
    A parent = new A();
 
    //more code
 
}
 
class A{
 
    B child = new B();
 
    int e;
 
    //more code
 
}
 
class B{
 
    int c;
 
    int d;
 
    //more code
 
}




--------------------编程问答--------------------
引用 7 楼 dracularking 的回复:
本地变量(local variables)都是在栈中生成,main中基本数据类型属于本地变量吧?
实例变量(instance variables)在堆中生成



可以看这个例子

Java code?123456789101112131415161718192021222324252627public static void main(String arg……



public class Test{
   private int i = 0;
   private String s = "abc";
   public static void method(){
    int k = 1;
    String b = "bcd";
}
   public static void main(String[] arges){
     int w = 2;
     String d = "qwe";
    Test  t = new Test();
    t.method();
}
}


w 与 d 保存在那里?
那么,i 与 s 保存在栈 还是在 堆里?
还有就是k 与 b 保存在 栈 还是在 堆 里? --------------------编程问答-------------------- w d 栈
i s 堆
k b 栈 --------------------编程问答-------------------- 为会k b 是在栈?
 Test  t = new Test();
 t.method();
 不是定义对象实例保存在堆里,而method()是Test()的方法 ,那么这个method()不是也在堆里吗? 这里有点不懂…… --------------------编程问答-------------------- 将《深入Java虚拟机》第二版第五章看一遍,再交流会更顺畅 --------------------编程问答-------------------- 首先hot spot虚拟机是将内存分为 方法区 虚拟机栈 本地方法栈 堆 和程序计数器

类的信息方法信息 等等会存在方法区中

Parent p = new Son();应该是定义一个方法里吧

每一个方法从执行开始到执行结束都对应着一个虚拟机栈中的栈帧的入栈到出栈
方法中的基本类型的局部变量都会存入栈中,引用类型存引用地址,具体实例放到堆中

首先类加载的时候会把类信息放到方法区中 ,类信息中就包含了这个类的所有信息 包括方法

Parent p = new Son()

虚拟机会把他压入栈,然后栈中p引用指向堆中实例,堆中实例包含2部分,第一实例,第二指向方法区中类信息,这样这个类有什么方法就能掉什么方法了,parent类中肯定没有son的方法了 对吧  就是这样 你明白了吗 --------------------编程问答-------------------- 在此例中:
Parent p = new Son();

我们把上面的分为静态类型(Parent) 和 动态类型(son) 
静态类型在编译期可知。动态类型在运行期可知。
在编译时  编译器编译的时候并不知道实际类型是什么,所以不可以访问动态类型的特有方法。

在运行时:
首先:父类指向的是son的实例。
你需要知道,在jvm中,方法的实现是存在于方法区的。每一个类在方法区中会建立一个虚方法表,这个虚方法表中存放的是各个方法的实际入口地址。
如果父类中的方法被重写了,那么子类方法的实际入口地址会改变。如果父类中的方法未重写,那么子类的方法实际入口指向父类的方法入口。
--------------------编程问答-------------------- 谢谢楼上各位!!!真的学了很多
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,