先创建Student类
//学生类
//学生类只是一个模板
//描述了所有学生的共同特征【状态+行为】
//当前类只描述学生的状态信息【属性】
public class Student {
//类体 = 属性 + 方法
//属性【存储数据采用变量的形式】
//由于变量定义在类体中,方法体之外的变量成为成员变量
int no;//学号
String name;//名字
int age;//年龄
boolean sex;
}
什么是对象 new运算符在堆内存中开辟的内存空间称为对象 什么是引用 引用是一个变量,只不过变量里面存的是另一个JAVA对象的内存地址 JAVA语言中,程序员不能直接操作堆内存,JAVA中没有指针 JAVA语言中,程序员只能通过“引用”去访问堆内存当中的对象内部的实例变量:引用.变量名;
接下来创建对象
public class OOtest01 {
//对象的创建和使用
public static void main(String[] asgs){
//通过一个类可以实例化n个对象
//实例化对象 new 类名();
//new是JAVA中的运算符
//new 是创建对象,在JVM中开辟新的内存空间
//方法区内存:在类加载的时候, class字节码代码片段被加载到该内存空间中
//栈内存【局部变量】:方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈
//堆内存:new 对象在堆内存中存储
//int 是基本数据类型
//i 是变量名
//10 是int 类型的字面值
int i = 10;
//Student 是引用数据类型
//s是变量名
//new Student(); 是一个学生对象
Student s = new Student();//s 是局部变量,在栈中存储
int stuNo = s.no;
String stuName = s.name;
int stuAge = s.age;
boolean stuSex = s.sex;
System.out.println("学号 = "+stuNo);
System.out.println("名字 = "+stuName);
System.out.println("年龄 = "+stuAge);
System.out.println("性别 = "+stuSex);
}
}
基本数据类型的默认值
内存:
如果要修改对象的值
s.no = 10;
s.name = "Jack";
s.age = 18;
s.sex = true;
int stuNo = s.no;
String stuName = s.name;
int stuAge = s.age;
boolean stuSex = s.sex;
System.out.println("学号 = "+stuNo);
System.out.println("名字 = "+stuName);
System.out.println("年龄 = "+stuAge);
System.out.println("性别 = "+stuSex);
再创建一个对象,堆内存里再开辟一个空间:
Student stu = new Student();
其实,String也是引用数据类型,那么name里放地址,再开辟一个String空间:
因此,引用,可以是局部变量,也可以是实例变量
JVM主要有三块内存空间:栈内存、堆内存、方法区内存
堆内存和方法区内存各有1个,一个线程一个栈内存。
方法调用的时候,该方法所需内存空间在栈内存中分配,成为压栈,方法执行结束后,该方法所属内存空间释放,成为弹栈。
栈中主要存储的是方法体中的局部变量。
代码片段会被存储到方法区内存中,在类加载的时候代码片段会载入。
在程序执行过程中,new创建的对象是存储在堆内存中,对象内部有实例变量,所以实例变量存放在堆内存中。
变量分类:
局部变量【方法体中声明】
成员变量【方法体外声明】
实例变量【前面修饰符没static】
静态变量【前面修饰符有static】
静态变量存储在方法区内存中
三块内存中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要是针对是堆内存。
垃圾回收机制(自动垃圾回收机制,GC)什么时候会考虑将某个JAVA对象的内存回收?
当堆内存当中的JAVA对象成为垃圾数据的时候,会被垃圾回收机制回收。
什么时候堆内存中的JAVA对象成为垃圾数据?
没有更多的引用指向它;
这个对象无法被访问,因为访问对象只能通过引用方式访问。