开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
类与对象
类与对象的区别和联系
1)类是抽象的,概念的,代表一类事务,比如人类,猫类……,即它是数据类型 2)对象是具体的,实际的,代表一个具体事务,即 是实例 3)类是对象的模板,对象是类的一个个体,对应一个实例
对象在内存中的存在形式(必须搞清楚)
成员方法/属性 中的细节
(1)从叫法上来看,属性 = 成员变量
(2)属性的定义类型可以为任意类型,包含基本类型和引用类型
(3)属性是类的一个组成部分,一般为基本数据类型
(4)属性如果不赋值,则默认值和数组一致
(5)属性的定义方法与变量相同。如:访问修饰符 数据类型 属性名;
如何创建对象
创建对象有两种方法,一种是先声明再创建,一种是直接创建
(1)先声明后创建
cat1 = new Cat(); // 创建对象 cat1
(2)直接创建对象
Cat cat1 = new Cat(); // 直接创建对象
一般我们都会使用第二种直接创建对象的方法创建对象,但并不能说第一种方法没用,有的情况下我们也需要使用第一种方法进行创建对象。
如何访问属性
访问属性的基本语法为:
对象名.属性名;
如:cat.name cat.age
类与对象的内存分配机制
public sttaic void main(String[] args) {
Person p1 = new Person();
p1.name = "荞慧子";
p1.age = 18;
Person p2 = p1; //p1 指向 p2
System.out.println(p2.name + p2.age);
}
}
class Person {
String name;
int age;
}
可以看出,把 p1 赋给 p2 (让p1指向p2)后,p1 和 p2 指向了同一个内存空间,所以输出p2中的name和age就是荞慧子 18。
这里就要和小伙伴们说一下Java内存的结构分析了
1)栈:一般存放基本数据类型,也就是局部变量
2)堆:堆主要存放对象(Cat cat1 ,数组等)
3)方法区:包含常量池(常量,如字符串等),类加载信息
练习
阅读下面一段代码,写出输出结果
public static void main(String[] args) {
Person a=new Person();
a.age=10;
a.name="小明";
Person b;
b = a;
System.out.println(b.name);
b.age = 20;
b = null;
System.out.println(a.age);
System.out.println(b.age);
}
}
class Person {
String name;
int age;
}
输出结果为:
小明
20
可以看出,前两个输出语句都可以正常输出,但是第三个却出现了异常,这就需要分析一波内存分配了。
1)运行第一个输出语句时已经执行了 b = a,说明a和b都指向了同一个数据空间,所以输出b.name就是输出 小明。
2)第二个输出语句输出的是 a.age ,因为已经执行了 b.age = 20,所以说明更改了内存中原来的年龄10变为了20,(注意:因为a和b指向同一个内存空间,所以更改b.age就是更改内存中的地址,导致a的值也会改变!!!)所以会输出20。
3)第三个输出要很注意,为什么抛出了一个异常?这里就要去了解这个b = null语句执行后内存中发生了什么变化。
结合下图分析:
当运行到 b = a 时,说明a和b都指向了同一个内存空间0x0011(自命名,纯属讲课使用),执行了b.age后,内存中的age由10变成了20。所以执行语句System.out.println(a.age);后输出a中的年龄也是20。
然后运行 b = null,这里要特别注意,把空字符赋给b后,堆中的内存并不会发生改变,因为将空字符指向b后代表的是让b不再指向内存空间0x0011,就等于将图中黄色的线切断,b不再指向堆,但不会影响堆中内存的值。所以语句System.out.println(a.age);不会受到影响。