这些天一直都想找个机会把Java内存方面的知识整理整理,毕竟任何知识都涉及到这方面。Java内存分析是java学习的一大重点。
下面我们进入正式话题讨论:
我们知道Java内存大致分为三块:如下图
我们先大致了解下java各分区的数据存放内容:
栈区:主要为方法服务,存在许许多多的方法栈帧,在方法栈帧里开辟局部变量开辟空间,基本类型按基本数据类型数据大小开辟空间,而引用类型则开辟四个字节大小。
堆区:主要存放创建的对象数据。
方法区:主要存放加载的类,静态变量,静态初始化块,常量,以及程序运行的代码。
下面我们来分析一段程序,一遍帮助我们更好学习java内存:
首先jvm从主方法进入 先加载Mydog类到方法区然后将Animal类加载到方法区,并为静态变量myAnimal在方法区开辟空间并默认初始化。
然后在堆区创建Dog类型对象:1首先为父类属性开辟空间并默认初始化,然后调用父类构造方法进行初始化。
2再为子类新增属性开辟空间再调用子类构造方法
3再为子类继承父类的方法和子类新增方法开辟空间。至此Dog类型对象创建完毕。
然后将myAnimal引用指向新创建出来的Dog类型对象(也称之为向上转型)。
之后myAnimal引用调用子类Dog继承父类的方法setWeight()。
最后调用子类Dog继承父类的方法getWeight(),并将其打印出来。
Ps:这里值得注意的是向上转型后即myAnimal=new Dog();
1. myAnimal引用访问不了父类私有属性(和方法)。
2. myAnimal引用访问不了子类新增属性(和方法),可以访问继承的属性和方法。