JavaSE(上)-Day7
- 类和对象
- 封装
- private
- this
- 构造方法
- 标准JavaBean
- 对象的内存图
- 执行Test类main方法生成一个User对象的内存过程
- 基本数据类型和引用数据类型的区别
- this的内存原理
- 成员变量和局部变量区别
类和对象
- 类是设计图纸,对象是真正的实例
- 定义一个类后,就可以用 类名 对象名 = new 类名();创建一个对象
- 通过对象名.属性; 获取属性值, 通过对象名.方法名(…); 执行方法;
- 建议类名使用大驼峰命名法,见名知意
- 类中可以有很多个class类,但是只能由一个public修饰的class类,且public修饰的类名必须和文件名保持一致
- 类中定义的属性完整格式是 修饰符 数据类型 属性名 = 值; 在没有显式赋值时,属性是有默认值的,参考数组的默认值
封装
- 封装告诉我们如何正确的设计对象的属性和方法
- 对象是谁,就要封装他的数据,提供他的行为方法
private
- private是私有访问修饰符
- private修饰的成员只可以在本类中被访问
- private修饰的成员如果想要外界使用,需要对应的getter,setter方法,用于获取属性和设置属性值
- private为封装的对象提高了安全性
this
- this可用于区分成员变量和局部变量 this.成员变量是类的属性,局部变量是方法中的变量
- 局部变量的优先级高于成员变量
构造方法
- 构造方法是在创建对象的时候,由虚拟机调用的,为成员变量初始化赋值
- 构造方法在不写的时候,会有一个隐式的无参构造方法
- 构造方法一旦显式定义,不会再提供隐式的无参的构造方法,需要显式定义
标准JavaBean
- 类名见名知意
- 类名的属性用private修饰
- 设置对应的getter和setter方法
- 定义无参和全参构造方法
- 追加其他必要的方法
对象的内存图
- JDK8之前,JVM中的堆空间后跟着方法区
- JDK8后,JVM中的堆空间后方法区被去掉,设计出一块独立空间元空间,方法区的一部分功能划分给堆,一部分划分给元空间
- 字节码文件运行时,会进入元空间运行,临时存储
- 元空间会存储字节码文件的信息,包括了成员变量和成员方法
执行Test类main方法生成一个User对象的内存过程
- 执行有main方法的Test类,Test.class进入元空间临时存储
- main方法进栈执行
- User.class进入元空间临时存储
- 栈中开辟一个空间,名称为user
- 堆中开辟一个空间,拷贝元空间中User.class的成员变量和成员方法的地址
- 成员变量先默认初始化,整数为0,字符串为null等
- 成员变量然后显示初始化,如果成员变量有直接赋值操作
- 最后构造函数初始化成员变量
- 完成后,将开辟空间的地址回传给栈中user存储
- 打印user,显示的是地址值
- user.方法名() 过程是通过地址,向堆中找方法的地址,找到元空间对应的类中的方法,让方法进栈执行,执行完毕出栈
- 当main方法结束后,栈中的变量也随之消失,堆中的对象没有任何变量被指向,也会作为垃圾被回收
- 定义多个User时,字节码文件只会加载一次
基本数据类型和引用数据类型的区别
- 栈中基本数据类型存储的是真正的值,引用数据类型存储的是地址
- 基本类型给其他基本类型赋值就是真正的值,引用数据类型给其他引用数据类型赋值是地址,指向同一个堆内存空间
this的内存原理
this表示方法调用者的地址值
成员变量和局部变量区别
不同点 | 成员变量 | 局部变量 |
---|---|---|
定义位置不同 | 方法外类中 | 方法中 |
内存存储位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随对象创建和消失 | 随方法调用创建和消失 |
初始化不同 | 有默认值 | 无默认值,使用需赋值 |
作用域 | 整个类 | 方法中有效 |