小白的20天Java学习打卡day12

太原理工大学机器人团队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);
    }
}

引用是一个变量,变量包括局部变量和成员变量

最后的内存图

这里是引用
OOTest01

测试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);//北京
      
    }
}

最后的内存图

这里是引用
OOTest02

内存的详解

①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);
	}

}

实例相关的数据表示:这个数据访问的时候必须有对象的参与。这种数据就是实例相关的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值