一、回顾
public class Student{
//类体=属性+方法
//属性【存储数据采用变量的形式】
//由于变量定义在类体中,方法体之外,这种变量称为成员变量
//每个学生都有学号,但每个学生的学号不同
//所以要访问这个学号必须先创建对象,通过对象去访问学号信息
//学号信息不能直接通过类去访问,所以这种成员变量又被叫做实例变量
//对象又被称为实例,实例变量又被称为对象变量【对象级别变量】
//不创建对象,no变量的内存空间不存在
int no;
String name;
int age;
boolean sex;
}
二、对象的创建和使用
public class OOTest01 {
public static void main(String[] args){
/* 通过一个类可以实例化N个对象
实例化对象的语法:new 类名();
new是java语言中的一个运算符
new运算符的作用时创建对象,在JVM堆内存中开辟新的内存空间
方法区内存:在类加载的时候,class字节码代码片段被加载到该内存空间中
栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间在栈内存中压栈
堆内存:new的对象在堆内存中存储
*/
Student s = new Student();
//Student是一个引用数据类型,s是一个变量名,new Student()是一个学生对象
//把堆内存对象的地址赋值给s
//什么是对象:new运算符在堆内存中开辟的内存空间称为对象
//什么是引用:引用是一个变量值,这个变量中保存的是对象的内存地址
//java中,程序员不能直接操作堆内存,java中没有指针,只能通过引用去访问堆内存当中对象内部的实例变量
int stuno = s.no;
String stuname = s.name;
int stuage = s.age;
boolean stusex = s.sex;
System.out.println("学号:"+ s.no);
System.out.println("姓名:"+ s.name);
System.out.println("年龄:"+ s.age);
System.out.println("性别:"+ s.sex);
s.no = 2020;
s.name = "jack";
s.age = 20;
s.sex = true;
System.out.println("学号:"+ s.no);
System.out.println("姓名:"+ s.name);
System.out.println("年龄:"+ s.age);
System.out.println("性别:"+ s.sex);
}
}
套娃使用
public class Address {
//城市
String city;
String street;
String zipcode;
}
public class User {
//用户名、编号、住址
String name;
int no;
Address addr;//Address是引用数据类型,代表家庭住址
}
public class OOTest02 {
public static void main(String[] args) {
User u = new User();
System.out.println(u.no);
System.out.println(u.name);
System.out.println(u.addr);
u.no = 110;
u.name = "tom";
u.addr = new Address();
u.addr.city = "BeiJing";
u.addr.street = "王府井";
u.addr.zipcode = "010";
System.out.println(u.no);
System.out.println(u.name);
System.out.println(u.addr);
System.out.println(u.name + "居住在哪个城市:"+u.addr.city);
System.out.println(u.name + "居住在哪个街道:"+u.addr.street);
System.out.println(u.name + "的邮编:"+u.addr.zipcode);
}
}
三、JVM内存分析
1.JVM(JAVA虚拟机)主要包括三块内存空间,分别是:栈内存、堆内存、方法区内存
2.堆内存和方法区内存各有一个、一个线程一个栈内存
3.方法调用的时候,该方法所需要的内存空间在栈内存中分配,称为压栈,方法执行结束后。该方法所属的空间释放,称为弹栈。
4.栈中主要存储的方法体当中的局部变量
5.方法的代码片段以及整个类的代码片段都被存储到方法区内存中,在类加载的时候代码段会载入
6.在程序执行过程中使用new运算符创建的java对象,存储在堆内存中,对象内部有实例变量,所以实例变量存储在堆内存中
7.变量分类:
- 局部变量【方法体中声明】
- 成员变量【方法体外声明】
*实例变量【前面修饰符没有static】
*静态变量【前面修饰符有static】
8.静态变量存储在方法区中
9.三块内存中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存。
10.自动垃圾回收机制,什么时候考虑将某个java对象的内存回收? - 当堆内存当中的java对象成为垃圾数据的时候,会被垃圾回收
- 什么时候堆内存中的java对象会变成垃圾呢?
:没有更多的引用指向他的时候,这个对象无法被访问,因为访问对象智能通过引用的方式访问
四、关联关系
A has a B【A对象中含有B对象的引用】
Student对象中含有no对象的引用:Student no
五、复习
public class Laptop {
String brand;
String no;
String color;
double price;
String owner;
}
public class Student {
int idno;
String name;
Laptop notepad;
}
public class OOTest {
public static void main(String[] args) {
//新建一个学生对象
Student lisi = new Student();
//新建一个电脑对象
Laptop computer = new Laptop();
//让电脑和学生联系起来
lisi.notepad = computer;
//具体赋值
computer.brand = "Dell";
computer.color = "Black";
computer.no = "XPS9550";
computer.price = 9999.0;
System.out.println("李四的笔记本的品牌是"+ lisi.notepad.brand);
lisi.notepad.brand = "苹果";
System.out.println("李四的笔记本的品牌是"+ lisi.notepad.brand);
}
}