在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. unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计

    unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计 最近做玩票性质的游戏项目,客户端技术是 unity3d 和 android. ...

  2. 小米OJ刷题日志

    虽然这OJ上的题比较水,但还是挺有意思的.关键是能赚钱 特别是提交方式 居然不支持C++,垃圾OJ 4. 最长连续数列 排序后dp 5. 找出旋转有序数列的中间值 写个排序就做完了. 6. 交叉队列 ...

  3. 使用history.replaceState 修改url 不跳转

    history.replaceState(null,null,this.urlR);  //关键代码 history.replaceState是将指定的URL替换当前的URL 注意:用于替换掉的URL ...

  4. VueJs $watch()方法总结!!

    最近公司用vue框架写交互,之前没怎么写过,但是很多数据双向绑定的东东跟angular很像!所以上手很快!哈哈 今天就碰到一个vue的问题啊!!产品需求是,datetimepick时间选择器一更改时间 ...

  5. arcgis jsapi接口入门系列(9):可以同时显示多个的地图popup

    jsapi有提供popup功能,但缺点很多,例如地图上只能同时显示一个popup,popup内容有限制等 本文提供另一个方法,原理不用jsapi,在地图外用一个普通的div放在地图上面,再监听地图的鼠 ...

  6. idea2018.1.2 激活

    https://www.cnblogs.com/ycjcham/p/8724451.html

  7. SQL Server 父子迭代查询语句

    -- 根据父ID得到所有子ID -- Get childs by parent idWITH TreeAS( SELECT Id,ParentId FROM dbo.Node P WHERE P.Id ...

  8. Python+Selenium之断言对应的元素是否获取以及基础知识回顾

    # coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.maximize_window () ...

  9. C#解析 json格式

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

  10. android 内存泄露测试

    Android 程序由java语言编写,android的内存管理与java相似,通过new为对象分配内存,所有对象在java堆内分配空间,对象回收有个垃圾回收器来完成.GC就是垃圾收集的意思(Gaba ...