- 对象的创建和使用-----内存分析
public class OOTest01
{
//通过一个类可以实例化N个对象,实例化对象的语法:new 类名();
//new运算符的作用是创建对象,在JVM堆内存当中开辟新的内存空间
public static void main(String[] args){
//方法区内存:在类加载的时候,class字节码代码片段被加载到该内存空间当中
//栈内存:方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈
//堆内存:new的对象在堆内存中存储
Student s=new Student();
//s是一个局部变量,在栈内存中存储,new Student()是一个学生对象
}
}
//学生类,属于引用数据类型,Student是类型名
class Student{
//类体=属性+方法
//每一个学生的学号不同,要访问这个学号必须先创建对象,通过对象去访问学号信息。
//学号信息不能直接通过类去访问,所以这种成员变量又被叫做:实例变量
//访问实例变量的语法:读取数据:引用.变量名 修改数据:引用.变量名=值;
//对象又被称为实例,实例变量又被称为对象变量
int sid;
String name;
int age;
boolean sex;
}
上述代码的内存分析图如下:
补充:
package com.Tanya.note;
public class Test{
public static void main(String[] args) {
Users u=new Users();//u是局部变量,是一个引用,u保存内存地址指向堆内存的user对象
//输出User对象内部实例变量的值
System.out.println(u.sid);
System.out.println(u.name);
System.out.println(u.addr);
//修改User对象内部实例变量的值
u.sid=110;
u.name="jack";//jack是一个Java对象,属于String对象
u.addr=new Address();
System.out.println(u.name+"居住在哪个城市:"+u.addr.city);
System.out.println(u.name+"居住在哪个街道:"+u.addr.street);
}
}
class Address {
//家庭住址类
String city;
String street;
String zipcode;
}
class Users{
//用户类;以下都是成员变量中的实例变量(成员变量包括实例变量和静态变量,成员变量存在堆内存)
int sid; //基本数据类型:引用型
String name;//String:引用数据类型:代表字符串
Address addr;//Address也是一种引用数据类型,代表家庭住址
//sid是一个实例变量,addr和name既是一个实例变量,也是一个引用,(存储对象地址的变量是引用)
//引用是变量中保存了内存地址,指向了堆内存当中的一个对象,这种变量被称为引用
}
内存图:
2. 简单分析下面一段代码的内存分配:
public class main {
public static void main(String[] args) {
A aa=new A();
//(A*)malloc(sizeof(A));
aa.i=10;
aa.j=20;
System.out.println(aa.i+aa.j);
}
}
class A{
int i;
int j;
}
new A():在堆中动态分配一块区域,被当做了A对象,其实aa本身的内存是在栈中分配的,堆中内存的地址赋给了aa,然后aa就指向了堆中的内存,即aa代表了堆中的内存;
aa.i 代表: aa这个静态指针变量所指向的动态内存中的A对象的i这个成员
aa.j代表: aa这个静态指针变量所指向的动态内存中的A对象j这个成员