一个实例中会有各种数据类型,例 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
}
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()不是也在堆里吗? 这里有点不懂……
得来(在这篇文章的中间位置)"栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄",感觉很正解啊……
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中的基本数据类型保存在那里?
实例变量(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
}
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 保存在 栈 还是在 堆 里?
i s 堆
k b 栈
Test t = new Test();
t.method();
不是定义对象实例保存在堆里,而method()是Test()的方法 ,那么这个method()不是也在堆里吗? 这里有点不懂……
方法中的基本类型的局部变量都会存入栈中,引用类型存引用地址,具体实例放到堆中首先类加载的时候会把类信息放到方法区中 ,类信息中就包含了这个类的所有信息 包括方法Parent p = new Son()虚拟机会把他压入栈,然后栈中p引用指向堆中实例,堆中实例包含2部分,第一实例,第二指向方法区中类信息,这样这个类有什么方法就能掉什么方法了,parent类中肯定没有son的方法了 对吧 就是这样 你明白了吗
Parent p = new Son();我们把上面的分为静态类型(Parent) 和 动态类型(son)
静态类型在编译期可知。动态类型在运行期可知。
在编译时 编译器编译的时候并不知道实际类型是什么,所以不可以访问动态类型的特有方法。在运行时:
首先:父类指向的是son的实例。
你需要知道,在jvm中,方法的实现是存在于方法区的。每一个类在方法区中会建立一个虚方法表,这个虚方法表中存放的是各个方法的实际入口地址。
如果父类中的方法被重写了,那么子类方法的实际入口地址会改变。如果父类中的方法未重写,那么子类的方法实际入口指向父类的方法入口。