深入java (类)构造函数和对象创建的内存分配

来源:互联网 发布:centos怎么看版本 编辑:程序博客网 时间:2024/06/04 01:33

之前的文章总结了java一些较为常用的关键字,现在我们要进入到类里面,总结类的特征(其中包括了内存和构造函数,gc垃圾回收),java中类的继承和初始化顺序(会涉及到ClassLoader),java多态的深入,java抽象类、接口的深入理解和例子。今天从类开始。原创不易,转载请注明出处:http://blog.csdn.net/yabay2208

  • 从计算机原理角度初探java类对象使用的堆和栈
  • java类构造函数

一:从计算机原理角度初探java类对象使用堆和栈

在我们了解创建对象真正发生之前,需要对生存在java中的事物更加了解,我们需要更加了解java的堆(heap,对象生存的空间)和栈(stack,方法调用和变量生存的空间)。当java虚拟机启动的时候,他会从底层的操作系统取得一块内存来执行java程序,至于内存的大小和你是否可以调用取决与JVM的平台和版本。所有对象都存在与可垃圾回收的堆内存上。
实例变量:声明在类里面而不是方法里,存活在堆内存中,被对象调用,生命周期和对象一起存亡。别名叫:成员变量。

局部变量:定义在方法中,存活在栈内存中,被方法使用,生命周期和方法一起存亡。

静态变量:声明在类里面而不是方法里,存活在方法区中,被类和对象使用,生命周期和类一起存亡。


方法如何被调用?
我们进一步探究当方法迭代调用时:是如何在内存中排列的。用一个例子配合图片说明:

public void firstStep(){    boolean b = true;    secondStep(2);}public void secondStep(int x){    int s = x + 100;    thredStep();}public void thredStep(){    List list = new ArrayList();    list.add(1);    list.add(2);    list.add(3);}

我们分析一下内存中是如何使用这一段代码:
第一步:
当某段程序调用firstStep()使得firstStep()被放在栈内存最上方的栈块中,同时这个栈块中有boolean b,且值为true;

第二步:
firstStep()调用secondStep使得secondStep被放在栈内存最上方的栈块中,同时这个栈块中有x和z;

第三步:
secondStep调用thredStep()使得thredStep()被放在栈内存最上方的栈块中,同时这个栈块中有list句柄,同时list句柄会指向在堆内存中创建的new ArrayList(),”=”号将list句柄和堆内存进行链接。进行add操作后,堆空间多出来了1,2,3的空间;

第四步:
thredStep()执行完毕之后,thredStep()出栈,list立刻被销毁,new出来的对象等待被gc回收;执行回到secondStep(),secondStep()执行完毕之后,出栈,s和x立刻被销毁;执行回到firstStep(),firstStep()执行完毕后,出栈,b被销毁。执行完毕。

配图片说明:
这里写图片描述

二:java类构造函数

对这个知识点做一个总结:

1:构造函数是我们在新建一个对象的时候会用到的函数:new …

2:构造函数名称必须和类名一样,而且没有返回值。

3:构造函数如果我们没有声明,那么程序在编译期的时候,编译器会自动给我们添加一个没有参数的构造函数。

4:构造函数的一般功能是:对类的实例变量进行初始化操作。构造有特定属性的对象。

5:构造函数可以重载,但是不能有相同的参数类型和顺序。

限于篇幅,下一篇总结:java中类的继承,继承关系中生成子类对象时:构造函数会如何执行才可以确保继承的子类可以准确无误保留父类的属性。

0 0
原创粉丝点击