关于java内存分析的探讨

这些天一直都想找个机会把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引用访问不了子类新增属性(和方法),可以访问继承的属性和方法。

 

posted @ 2015-08-05 10:17  kimoyoyo21  阅读(186)  评论(0编辑  收藏  举报