有一个自定义类:
class A{
int a=0;
int b=0;
String s="abc";
A a=null;
A b=new A();
public void f1(){
A c=new A();
}
public void f2(){
String s2="bcd";
}
}
然后主函数main()中这样调用:
main(){
A a=new A();
a.f1();
a.f2();
}
有以下问题请教:
1、主函数中,当执行A a=new A()时,我们知道,a相当于指针,被分配在栈中;new A()才是真正的对象,被分配在堆中。那么,a实例中的引用类型成员变量a和b此时如何分配内存的,分配在哪?指针和实例都在堆中吗?
另外,a实例中的字符串成员变量s是被分配在内存的哪个区域?常量区还是堆区?
class A{
int a=0;
int b=0;
String s="abc";
A a=null;
A b=new A();
public void f1(){
A c=new A();
}
public void f2(){
String s2="bcd";
}
}
然后主函数main()中这样调用:
main(){
A a=new A();
a.f1();
a.f2();
}
有以下问题请教:
1、主函数中,当执行A a=new A()时,我们知道,a相当于指针,被分配在栈中;new A()才是真正的对象,被分配在堆中。那么,a实例中的引用类型成员变量a和b此时如何分配内存的,分配在哪?指针和实例都在堆中吗?
另外,a实例中的字符串成员变量s是被分配在内存的哪个区域?常量区还是堆区?
2、当执行a.f2()语句时,字符串s2的值"bcd"是被分配在堆区,还是常量池?
1、主函数中,当执行A a=new A()时,我们知道,a相当于指针,被分配在栈中;new A()才是真正的对象,被分配在堆中。那么,a实例中的引用类型成员变量a和b此时如何分配内存的,分配在哪?指针和实例都在堆中吗?
对象在堆里,基础变量在栈里
另外,a实例中的字符串成员变量s是被分配在内存的哪个区域?常量区还是堆区?
这个字符串是预赋值的,相当于常量,在常量池,也就是方法区里
2、当执行a.f2()语句时,字符串s2的值"bcd"是被分配在堆区,还是常量池?
但凡你在代码里看到的="string"这种类型的东西,全部都在常量池里