太原理工大学机器人团队20天学习打卡day12
今天延续昨天的内容,继续学习对象的创建和使用,今天主要学习的是对内存的分析,这部分内容可能还要一天才能学完。另外,由于这部分内容比较难,笔记也只有几个例子和结果,没有过程,想要参考我笔记的朋友可能看得有点懵。有这种情况的朋友可以听听视频里的老师是怎么说的。
b站:av11361088 这一部分在112到122集
对象的创建和使用【内存分析】
创建一个家庭住址类
public class Address
{
//属性【以下都是成员变量之实例变量】
//城市
//String是一种引用数据类型,city是一个变量名,属于实例变量
//city是一个引用:保存内存地址的一个变量,该变量保存的内存地址指向了堆内存当中的对象
String city;
//街道
String street;
//邮编
String zipcode;
}
再创建一个用户类
public class User
{
//属性【以下都是成员变量之实例变量
//用户编号
//int是一种基本数据类型:整数型
//no是一个实例变量
int no;
//用户名
//String是一种引用数据类型
//name是一个实例变量,是一个引用
String name;
//家庭住址
//Address是一种引用数据类型:代表家庭住址【就是上面写的,自定义的】
//addr是一个实例变量,是一个引用
Address addr;
}
测试1【测试都是基于上面两个类】
【如果要尝试编译运行,记得带着上面两个】
public class OOTest01
{
public static void main(String[] args){
//创建User对象
//u是一个局部变量
//u是一个引用
//u保存内存地址指向堆内存的User对象
User u = new User();
//输出User对象内部实例变量的值
System.out.println(u.no);//0
System.out.println(u.name);//null
System.out.println(u.addr);//null
//修改User对象内部实例变量的值
u.no = 110;
u.name = "jack";
u.addr = new Address();
//在main方法当中目前只能看到一个引用“u"
//一切都只能通过u来进行访问
System.out.println(u.name + "居住在哪个城市:" + u.addr.city);
System.out.println(u.name + "居住在哪个街道:" + u.addr.street);
System.out.println(u.name + "邮编:" + u.addr.zipcode);
}
}
引用是一个变量,变量包括局部变量和成员变量
最后的内存图
这里是引用
测试2
public class OOTest02
{
public static void main(String[] args){
//u是引用
//u是局部变量
User u = new User();
//上一个测试中写的是
//u.addr = nwe Address();
//a是引用,是局部变量
Address a = new Address();
u.addr = a;
System.out.println(u.addr.city);//null
a.city = "北京";
System.out.println(u.addr.city);//北京
}
}
最后的内存图
这里是引用
内存的详解
①JVM(java虚拟机)主要包括三块内存空间:栈内存,堆内存,方法区内存。
②堆内存和方法区内存各有一个,一个线程一个栈内存。
③方法调用的时候,该方法所需要的内存空间在栈内存中分配,称为压栈。方法执行结束后该方法所属的内存空间释放,称为弹栈
④栈中主要存储的是方法体中的局部变量
⑤方法的代码片段以及整个类的代码片段都被存储到方法区内存当中,在类加载的时候这些代码片段会载入。
⑥在程序执行过程中使用 new运算符 创建的java对象存储在堆内存当中。对象内部有实例变量,所以实例变量储存在堆内存当中。
⑦变量分类
- 局部变量【方法体中声明】
- 成员变量【方法体外声明】
- 实例变量【前边修饰符没有static】
- 静态变量【前边修饰符中有static】
⑧静态变量存储在方法区内存当中。
⑨三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存。
⑩垃圾回收器【自动垃圾回收机制,GC机制】什么时候会考虑将某个java对象的内存回收呢
- 当堆内存当中的java对象成为垃圾数据的时候
- 什么时候堆内存中的java对象会变成垃圾呢
- 没有更多的引用指向它的时候。
- 这个对象无法被访问,因为访问对象只能通过引用的方式访问
测试3【空指针异常】
public class Customer
{
//id
int id;
}
public class OOTest03
{
public static void main(String[] args){
Customer c = new Customer();
System.out.println(c.id);
c = null;
//以下程序编译可以通过,因为符合语法
//运行出现空指针异常
//空引用访问“实例”相关的数据一定会出现空指针异常
//java.lang.NullPointerException
System.out.println(c.id);
}
}
实例相关的数据表示:这个数据访问的时候必须有对象的参与。这种数据就是实例相关的数据