7. class(2)
7.6 object内存布局

7.6 属性 field / instance variable
- 从概念或叫法上看: 成员变量 = 属性 = field(字段) = instance variable
- 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。
比如我们前面定义猫类 的 int age 就 是属性.
7.6 属性instance variable的细节
- field的定义语法跟变量相同,示例:访问修饰符 属性类型 属性名;
这里老师简单的介绍访问修饰符: 控制属性的访问范围
【有四种访问修饰符 public, proctected, 默认, private ,后面会详讲】 - field的定义类型可以为任意类型,包含基本类型或引用类型
- field如果不赋值,有默认值,规则和数组一致。
7.7 创建object访问field
- 如何创建对象(2种)
- 先声明再创建【Cat cat ; //声明对象cat(只声明不会分配空间)。
cat = new Cat(); //创建】 - 直接创建【Cat cat = new Cat();】
- 如何访问属性
- 基本语法
object名.field名;
cat.name ;
cat.age;
cat.color; - class和object的内存分配机制(重要!!!) 看这个思考题。
我们定义一个人类(Person)(包括 名字,年龄)。
Person p1 = new Person();
p1.age = 80;
p1.name = "小明";
Person p2 = p1;
System.out.println(p2.age);
请问p2.age究竟是多少?并画出内存图:
答案:p2.age = 80

7.8 class + object的内存分类机制
- 栈stack:一般存放基本数据类型(局部变量)
- 堆:存放对象(Cat cat, 数组等)
- 方法区:常量池(常量,比如字符串),类加载信息
- 示意图
Person p = new Person();
p.name = “jack”;
p.age = 10
- 先加载Person类信息(属性和方法信息,只会加载一次)
- 在堆中分配空间, 进行默认初始化。
- 把地址赋给p,p就指向对象。
- 进行指定初始化, 比如 p.name =”jack” p.age = 10
- 习题分析
【b= null 意味着b对应的地址=null,它不连接object了。】

