本章讲解了对象的创建到被回收的过程,讲述了对象的生命周期
 
堆(heap)与栈(stack)
实例变量:实例变量是只声明在类下,方法外的变量(实例变量默认值为0/0.0/false,引用的默认值为null)
局部变量:声明在方法中的变量,或方法中的参数。又被成为栈变量
 
例如:
public class test{
     int size;
     public void foof(int a){
          int b;
          barf()
     }
     public void barf(){
          Duck d =new Duck(24);
     }
}
上面的例子中,
size为实例变量,每个实例都会有一个;
a和b为局部变量
d也是局部变量,但是非primitive(int等)变量,是一个对象引用变量。
 
放在堆(heap)上的:实例变量放在堆上,所有对象都会在堆上。java会根据实例变量的所需空间来进行分配(primitive的根据大小来分配,引用变量如果实例化了就将实例化的对象也放到堆上,如果没有就只放一个引用量)
放在栈(stack)上的:局部变量、被调用的方法。当前调用的方法会在栈顶显示(新调用的方法从栈顶插入)。
 
例如:上面的例子我们去调用
test a = new test();
a.foo()
 
那么堆和栈的情况如下:
 
 
构造函数
构造函数
使用new关键字时执行的程序代码,会创建一个对象实例,所有类都有一个构造含数据,如果没写编译器会给写一个默认的构造函数(如果自己建了构造函数,编译器不会帮忙创建构造函数)
public class Duck{
     public Duck(){
     }
}
 
构造函数名字与类名相同;且没有任何返回类型。
构造函数可以用于初始化对象的状态
 
重载构造函数
一个类可以存在多个构造函数,但是必须参数的个数或类型不同(与参数名无关),就和重载一样,叫做重载构造函数
 
例如:下面例子的重载构造函数都是合理的
public class mushroom{
     public mushroom(){}
     public mushroom(int size,boolean isMagic){}
     public mushroom(boolean isMagic,int size){}
}
 
父类的构造函数
子类对象包含自己和父类的实例变量,创建子类的对象时,所有继承下来的构造函数都会被执行
 
构造函数执行时,第一件事去执行它的父类的构造函数,这会连锁到Object这个类为止,这个过程被称为“构造函数链”。所以最终展示的效果是从Object到下的父类一层层的调用(堆栈,先进后出)
 
子类调用父类的构造函数使用super(),如果没加,编译器会自动给加上super(),super()放在子类构造函数的第一行
如果调用父类带参数的构造函数,子类的构造函数内要包含这个参数,且用super(参数)来调用
 
下面是调用被带参数和带参数的父类构造函数的方法。当然不带参数的调用不写super()也可以,编译器会自动加上
public class hippo extends animal{
     public hippo(){
     super()
     }
     public hippo(String name){
     super(name)
     }
}
 
this()
this指对象本身,只能用在构造函数中,放在第一行,所以this()和super()只能选择一个
使用this()来从某个构造函数调用同一个类中另外一个构造函数
 
例如下面的例子:
class mini extends car{
     Color color;
     public min(){
          this(Color.Red)  //实际调用public mini(Color c)构造函数
     }
     public min(Color c);
     super("mini")
     color=c;
}
 
对象的生命周期
对象的生命周期取决于引用它的“引用”,如果引用还在就活者,当最后一个引用消失了就变成可回收的
 
局部变量:方法中的局部变量的作用域只在声明它的方法中,方法调用完毕后局部变量回收(方法执行完毕会从堆栈中弹出),当方法A调用方法B时,方法A中的局部变量暂停保存值,当执行完B调回A时才继续活动
引用变量:引用变量与局部变量相同,只在处于范围内的时候能被引用,参考局部变量
实例变量:实例变量的作用域是它所属的类,如果对象还活着,实例变量就也活着,如果对象被释放了,也就释放了(实例变量和对象一起生活在堆上)
 
三种释放对象的方法:
1.将引用变量放在方法中,方法结束后也就被释放了
void go(){
     Life z=new Life)()
}
 
2.重新赋值新对象
Life z=new Life();
z=new Life(); //此时第一个对象在z被赋值后可回收
 
3.直接将引用赋值为null
Life z= new Life();
z=null;
 
注意:如果对象A被其他对象B等引用了,通过A=null或重新给A分配内存也不能释放该内存,因为该快内存还再被B占用

java基础四 [构造器和垃圾回收](阅读Head First Java记录)的更多相关文章

  1. java基础十一[远程部署的RMI](阅读Head First Java记录)

    方法的调用都是发生在相同堆上的两个对象之间(同一台机器的Java虚拟机),如果想要调用另一台机器上的对象,可以通过Socket进行输入/输出. 远程过程调用需要创建出4种东西:服务器.客户端.服务器辅 ...

  2. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  3. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  4. 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  5. Java中谈尾递归--尾递归和垃圾回收的比较

    一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点:    1.调用的是同一个 ...

  6. 在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  7. 《Beginning Java 7》 - 8 - Collecting Garbage 垃圾回收

    Java 垃圾回收机制原理: Java 语言使用 garbage collector 来进行垃圾回收.它是允许在后台的代码,间或地检查没有引用的对象(unreferenced object).发现后, ...

  8. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

  9. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

随机推荐

  1. 在VS2013平台下如何快速解决c++代码内存泄漏问题

    在学习FPS3000人脸关键点定位算法时,发现github上的源码,存在大量的内存泄漏问题,在训练的时发现内存一直在增长,测试的时候也存在内存无法彻底释放的问题. 一直以为是存放模型参数vector& ...

  2. Eclipse/MyEclipse连接Hadoop集群出现:Unable to ... ... org.apache.hadoop.security.AccessControlExceptiom:Permission denied问题

    问题详细如下: 解决办法: <property> <name>dfs.premissions</name> <value>false</value ...

  3. 一些css杂项笔记

    div[class*="col-"]{ background-color: gold; border: 1px solid #ccc; } //给class开头等于col-的div ...

  4. 2018-2019 网络对抗技术 20165226 Exp4:恶意代码分析

    2018-2019 网络对抗技术 20165226 Exp4:恶意代码分析 目录 一.实验内容说明及基础问题回答 二.实验过程 Task1 系统运行监控 结合windows计划任务与netstat命令 ...

  5. [UE4]C++代码操作SplineMesh

    转自:http://aigo.iteye.com/blog/2279503 void ARaceSpline::OnConstruction(const FTransform& Transfo ...

  6. 模型融合策略voting、averaging、stacking

    原文:https://zhuanlan.zhihu.com/p/25836678 1.voting 对于分类问题,采用多个基础模型,采用投票策略选择投票最多的为最终的分类. 2.averaging 对 ...

  7. 【Linux_Unix系统编程】chapter6 进程

    chapter6 进程 重点关注进程虚拟内存的布局及内容.6.1 进程和程序 进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时 ...

  8. 基于Linux的Samba开源共享解决方案测试(二)

    单NAS网关50Mb码率视音频文件的稳定读测试结果如下: 50Mb/s负载性能记录 NAS网关资源占用 稳定读 稳定读 CPU空闲 内存空闲 网卡占用 13个稳定流 96.70% 10G 104MB/ ...

  9. DOM事件机制(事件捕获和事件冒泡和事件委托)

    内容: 1.事件复习 2.事件冒泡与事件捕获 3.事件委托 1.事件复习 (1)事件 事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器 下面的链接 ...

  10. linux操作系统2 linux常用命令

    知识内容: 1.目录及文件操作 2.用户.群组与权限 3.重定向.管道 4.磁盘存储管理 5.系统命令 6.其他命令 参考: http://man.linuxde.net/ Linux命令规则:目录名 ...