在Java中,程序员会在乎内存中的两块空间。 堆(heap)和栈(stack)。

当java虚拟机启动时, 它会从底层的操作系统取得一块内存, 并且以此块内存来执行java程序。

在Java中, 实例变量是声明在类中而不是方法中的变量,实例变量存在于所属的对象中, 即实例变量会随着对象一起位于堆上。

Java中的局部变量以及平时所说的形参(方法的参数)都是被声明在方法中,局部变量会放在栈上。随着方法调用产生,当方法执行完毕局部变量的使命也就完成,

会被弹出栈空间而消失。Java中对象引用也可以看成是一种局部变量, 也是位于栈(stack)上的。

有一点始终要牢记, 那就是java中对象是会放在堆上的,即堆上会放着 new() 出来的对象。

然后关于java中变量的生命周期 :

1. 局部变量(local varible)只会存活在生命变量的方法中, 方法执行结束时局部变量会被弹出栈进而消失。

2. 实例变量,实例变量是随着对象一起存在于堆(heap)上的, 所以实例变量的生命周期与对象相同, 如果对象还活着那么实例变量也仍然存活。

3. 对象: 位于堆上,当没有引用指向对象时, 一段时间以后对象就会被垃圾收集器(GB)给清理掉了,位于对象上的实例变量也就消失了。

然后我们来回顾下对象创建的三个步骤 :  声明、创建、赋值。 例如 :Duck myDuck = new Duck(); 执行过程可以这样看 :

如果我们注意到第二步,new Duck() 看起来像是不是在调用Duck()的方法,其实不然, 我们此处通过new这个关键字调用了Duck()的构造函数。

构造函数并不是方法, 它是程序中带有new的时候会执行的代码。它能够在对象赋值给引用之前首先执行。

构造函数(constructor)是你初始化对象时会执行的程序代码。 也就是创建一个对象时会被执行。 当你自己没有写, 编译器在编译时会帮你加上一个没有参数的构造函数。

但是编译器一定会帮你写出无参的构造函数吗? The Answer is : NO !!!

编译器只会在你完全没有编写构造函数的时候帮你加上一个构造函数, 但是如果你已经写了一个有参数的构造函数, 而且再需要一个无参的构造函数,

你不能指望编译器会帮你加上, 你必须自己动手实现。

然后来看看构造函数的执行: 参考 http://www.cnblogs.com/beyond-Acm/p/4077320.html

有两条规则 :a. 子类的构造方法首先必须调用父类的构造方法。

          (可能刚开始学会觉得奇怪,为什么一定要首先去调用父类的构造方法呢? 其实换个思路可能理解起来就很简单了, 你可以吧父类想象成子类的父母,

          怎么可能父母还没造出来先把孩子造出来了呢?更何况孩子还需要从父母那里继承一些东西)

       b. 如果没有显示指定,子类的构造方法会默认的调用父类中的无参构造方法。这会连锁反应到object这个类终止。 这个过程被称为 constructor chaining 。

       c. 调用父类构造函数的唯一方法是 super()。

总结下编译器涉及构造函数的两种方式 :

1. 如果你没有编写构造函数, 那么编译器在编译时会帮你在类中加入如下代码 :

   public className () {

      super();

   }

2. 如果你自己编写了构造函数但是没有调用super(), 那么编译器会在你每个重载的构造函数之前都加上这种调用 : super(); 编译器帮忙加的一定是没有参数的构造函数

假如父类有多个构造函数, 那么也只有无参的构造函数会被调用到。 此时如果父类里没有无参的构造函数则会报错。

Java构造器(construtor)与垃圾收集器(GB)的更多相关文章

  1. 《深入理解 Java 虚拟机》学习 -- 垃圾收集器

    <深入理解 Java 虚拟机>学习 -- 垃圾收集器 1. Serial 收集器(新生代) 含义: 单线程收集器. 缺点: 进行垃圾收集时,必须暂停其他所有的工作线程. 优点: 简单而高效 ...

  2. 深入理解Java虚拟机(四)——HotSpot垃圾收集器详解

    垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有 ...

  3. 深入理解java虚拟机【Java虚拟机垃圾收集器】

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  4. (转)《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  5. Java虚拟机详解(四)------垃圾收集器

    上一篇博客我们介绍了Java虚拟机垃圾回收,介绍了几种常用的垃圾回收算法,包括标记-清除,标记整理,复制等,这些算法我们可以看做是内存回收的理论方法,那么在Java虚拟机中,由谁来具体实现这些方法呢? ...

  6. G1 垃圾收集器入门

    最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...

  7. 【转载】JVM 学习——垃圾收集器与内存分配策略

    本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collectio ...

  8. 转 G1垃圾收集器入门

    转自:http://blog.csdn.net/zhanggang807/article/details/45956325 最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的 ...

  9. G1 垃圾收集器架构和如何做到可预测的停顿(阿里)

    CMS垃圾回收机制 参考:图解 CMS 垃圾回收机制原理,-阿里面试题 CMS与G1的区别 参考:CMS收集器和G1收集器优缺点 写这篇文章是基于阿里面试官的一个问题:众所周期,G1跟其他的垃圾回收算 ...

随机推荐

  1. 关于小米手机USB传输稍大点的文件老中断的问题解决方法!

    关于小米手机USB传输稍大点的文件老中断的问题解决方法! 这是一个很痛苦的事情,当你传输大文件的时候,传输到一半就会莫名其妙的中断,拔插数据线很多次以后,好不容易没准可以成功传输一次. 后来使用了36 ...

  2. tomcat调优方案Maximum number of threads (200) created for connector with address null and port 8091

    1.tomcat6大并发出现:INFO: Maximum number of threads (200) created for connector with address null and por ...

  3. AJPFX关于ArrayList集合容器的操作

    1.创建     ArrayList<Egg> myList=new ArrayList<Egg>(); //<Egg>代表创建出Egg类型的List,新的Arra ...

  4. RK3288开发过程中遇到的问题点和解决方法之Kernel

    修改背光改变区间 kernel\drivers\video\backlight\pwm_bl.c static int pwm_backlight_update_status(struct backl ...

  5. uvm_reg_predictor——寄存器模型(十七)

    这是寄存器模型类中唯一派生自uvm_component的类,我们的寄存器模式需要实时,以最接近的方式知道DUT中寄存器的变化,uvm_reg_predictor就是为这个而生的. // TITLE: ...

  6. Java Object Model(一)

    Java作为OOP语言,抽象性不言而喻.如果需要深入了解Java语言的实现机制,则不得不对Java语言中基础的概念有清晰的了解.今天是我在cnblog上写博客的第一天,希望今天的博客可以是我成为未来& ...

  7. 单链表常见面试题(C语言实现)

    总结常见的单链表操作函数,复习使用,仅供参考,代码调试通过. #include<stdio.h> typedef struct node{ int data; struct node *n ...

  8. SharePoint运行状况分析器有关磁盘空间不足的警告

    对于负责管理SharePoint内部部署安装的SharePoint管理员,SharePoint Health Analyzer是一款出色的工具.此功能不仅有助于解决服务器故障和服务失败的问题,还提供了 ...

  9. 头文件种的ifndef/define/endif 是干什么用的

    头文件种的ifndef/define/endif 是干什么用的? 答:防止头文件被重复包含.

  10. Java(面试题):字符串截取

    在Java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符. 但对应的字节数不同,一个汉字占两个字节. 定义一个方法,按照指定的字节数来取子串. 如:对于“ab你好”,如果取三个字 ...