文章目录
- 前言
- 一个java对象的运行过程
- jvm内存分布
- 程序的基本运行程序
- 什么是对象?
- 对象与类的关系?
- 由类创建对象的顺序
前言
- 一个程序需要运行,需要在内存中开辟一块空间
- 类是构建对象的模板,只有类加载到内存中才能创建对象
一个java对象的运行过程
1、我们自己创建一个Test类,功能只有一个:System.out.println(“hello world”);
2、然后通过终端运行 javac Test.java,会将Test类编译成二进制字节码文件Test.class
3、然后我们继续运行 java Test.class,于是会打印出“hello world”。
4、控制着程序的执行流程的是虚拟机栈
( 打印的过程就是在内存中进行的)
jvm内存分布
- 由上边图可以看到,jvm主要分为五个区域。我们可以分为两大类:
线程独享:程序计数器、本地方法栈、虚拟机栈
线程共享:堆、方法区 - 每个区域主要的职责,参看上图就可以了,这里不多数
(各位读者,如果有了解本地方法栈的,欢迎留言哦)
程序的基本运行程序
在java中,万物皆可对象。那么,什么是对象呢,对象与类又是什么关系呢?
什么是对象?
- 对象是堆内的一块内存空间,是由类构建出来的
对象与类的关系?
- 类是构建对象的模板,类中有什么,对象当中有什么。
由类创建对象的顺序
-
我们先来一个Person类,然后再来一个Test类用来测试,一起来看一下顺序
-
代码
public class Person {String name;Integer age;Character sex;public static void breath(){System.out.println("会呼吸");}public void speek(){System.out.println("可以说话");} }
public class Test {public static void main(String[] args) {Person person1 = new Person();person1.name = "Lucy";person1.age = 20;person1.sex = 'F';System.out.println(person1.name+",年龄为:"+person1.age+",性别是:"+person1.sex);person1.breath(); // 也可以Person.breath();person1.speek();// person2是为了后续的内容讲解,此处先不用关注Person person2 = new Person();person2.name = "Lucy";person2.age = 20;person2.sex = 'F';person2.breath();person2.speek();} }
备注:person2是为了对比,下边内容讲解会先忽略这里,只看person1
-
内存图
执行顺序:
1、加载Test类信息到方法区中
2、main()方法入栈
3、加载Person类信息到方法区
4、给对象person1的name赋值,name为String类型,person1对象中name指向的是一个引用地址,数据存放在方法区的字符串常量池中
5、给对象person1的age赋值,age为Integer类型,当age取值为[-128,127]时,age指向的是数组中的某一个。如果超出范围,会创建新的Integer对象
6、给对象的sex赋值,在堆中创建一个对象
7、调用breath()方法
8、调用speek()方法 -
多说两句(以上边的person1和person2来比对)
- 如果age取值在[-128,127]内,多个对象指向的是同一内存空间
System.out.println(person1.age == person2.age); ------------- true
- 如果age取值不在[-128,127]之间,那么不同的对象的age需要在堆中额外创建对象
person1.age = 200; person2.age = 200; System.out.println(person1.age == person2.age); --------运行结果--------- false
- 对于Character类,只要值相等,那么多个对象指向的是同一空间地址
System.out.println(person1.sex == person2.sex); --------运行结果--------- true
- 如果age取值在[-128,127]内,多个对象指向的是同一内存空间