创建对象的两种方式:
①先声明再创建;
Cat cat;
cat = new Cat();
②直接创建
Cat cat = new Cat();
对象访问属性(语法):对象名.属性名
cat.name;
cat.age;
对象分配机制
//定义了一个Person类,包含年龄,名字
Person p1 = new Person();
p1.age = 10;
p1.name ="小明";
Person p2 = p1;//p1赋给了p2,或让p2指向p1
System.out.println(p2.age)//输出10
栈一般存放基本数据类型:(局部变量)
堆存放对象(cat ,数组)
方法区:常量池(常量,字符串),类加载信息
对象创建的过程(new的过程)
在实例化一个对象的时候,JVM首先会去检查目标对象是否已经被加载并初始化,如果没有
第一步,JVM会首先会立刻加载Person(目标)类信息(目标类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里面,然后是初始化的过程)(主要包括了属性和方法信息,但类信息只会加载一次)然后调用目标类的构造器去完成初始化(初始化的目的主要是对目标类里面的静态变量,成员变量,静态代码块进行初始化,当目标类被初始化以后,就可以从常量池里面去找到对应的类元信息了,并且目标对象的大小在类加载完成之后就已经确定了)。
第二步,为新创建的对象根据目标对象的大小,在堆内存中分配内存空间,(内存分配的方式一般有两种,第一种是指针碰撞,第二种是空闲列表,JVM会根据Java堆内存是否规整来决定内存的分配方法),之后JVM就会把目标对象里面的普通成员变量进行默认初始化(根据规则,如String置为null,int置为0,这一步骤主要是保证对象里面的实例字段不用初始化就可以直接使用,也就是程序能够直接获取这些字段对应的数据类型的0值),
第三步,把堆中的地址返回给/赋给p,p就指向对象。
第四步,进行指定初始化。
p1.age = 10;
p1.name ="小明";