以下针对引用数据类型:
在内存中,类是静态的概念,它存在于内存中的CodeSegment中。
当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一块控件,存放该对象,该对象拥有一些属性,拥有一些方法。但是同一个类的对象和对象之间并不是没有联系的,看下面的例子:
class Student{
static String schoolName;
String name;
int age;
void speak(String name){
System.out.println(name);
}
void read(){
}
}
class Test{
public statis void main(String[] args){
Student a = new Student();
Student b = new Student();
}
}
在上面的例子中,生成了两个Student对象,两个对象拥有各自的name和age属性,而schoolName属性由于是static的,被所有的对象所共有,而且每个对象都有权更改这个属性。
而对于方法speak()和read()来讲,它们被所有的对象所共有,但并不是说哪个对象拥有这些方法。方法仅仅是一种逻辑片段而已,它不是实物,严格来讲不能被拥有。
方法存在的意义就是对对象进行修改。(我的理解)
上述speak()方法,虽然两个对象都拥有相同的方法,但是由于其操作的对象不同,所以执行起来的效果也不同。再说一次,方法是看不见摸不着的,它仅仅是一种逻辑操作!只有当作用于具体的对象时,方法才具体化了!
方法在不执行的时候不占用内存空间,只有在执行的时候才会占用内存空间。
就好比说一个人会翻跟斗,他翻跟斗的时候是需要空间的,但是他不翻跟斗的时候是不需要额外的空间的。但是不管他翻不翻跟斗,他始终是具有翻跟斗的技能的。
Java中的内存布局(其他面向对象的语言也是如此)
Java中的内存空间分为四种:
1. code segment
存储class文件的内容,即我们写的代码。
2. data segment
存储静态变量
3. heap segment
堆空间,存储new出来的对象
4. stack segment
栈空间,存储引用类型的引用(注意,这里存储的不一定是对象所处的物理地址,但是一定能够根据这个内容在堆中找到对应的对象),局部变量和方法执行时的方法的代码