zoukankan      html  css  js  c++  java
  • 第5章 初始化与清理

     【本章的 垃圾回收与finalize()方法部分,真的是讲的太烂了】

       ·程序员      <初始化>

        ·编译器      <默认初始化>

        ·变量{字段,局部变量}  <占用>

        ·垃圾回收器            <清理>

        ·资源{内存}

        ·安全问题 - 代价

        ·特殊方法{构造器}       <创建> 对象  

        ·垃圾回收器 <释放> 内存资源

       

    5.1 用构造器确保初始化

        ·创建对象时、用户有能力操作对象前,Java自动调用相应的构造器,来确保对象初始化

        ·编译器在初始化期间调用与类名同名构造器

        ·概念上:初始化和创建彼此独立;在Java中,初始化和创建绑定在一起

        ·对于返回值为空(void),尽管方法本身不会返回什么,但仍可选择让它返回别的东西(这句怎么理解?)。构造器则不会返回任何东西。

        ·(构造器)无返回值 != (void方法)返回值为空(void)

        ·new 表达式<返回>(新建对象的)引用,构造器本身无返回值

    5.2 方法重载

        ·方法重载:同名不同参(想象调用时的情景,只有用参数列表才能作为多个重载方法的区分依据)。但访问权限、返回值类型可改变。

        ·重载原因:

           1.同名方法<表达>(有细微差异的)含义

           2.构造器—需要多种方式创建对象,而其名字已由类名决定(唯一)

        ·编译器<区分>重载方法:参数列表(类型,顺序)

        ·(涉及基本类型的)重载:

           ·普通整数         :默认为int型接收

           ·实参类型 < 形参类型:实际数据类型<被提升>#就近提升

           ·char型       :无匹配?直接提升至int型:正常处理

           ·实参类型 > 形参类型:(显式)类型转换{窄化}

    5.3 默认构造器的提供

        ·默认构造器:程序员创建了构造器?是:编译器创建

    5.4 this关键字

        ·this:指代方法调用者(让方法直到其调用者是谁),其实就是当前对象的引用

        ·编译器<区分>(同一类型的)(不同)对象的方式:将“所操作对象的引用”<作为>参数传递给方法。

            ·用this在构造器中调用构造器:构造器里this只能在起始处调用一个构造器

    5.5 清理:终结处理和垃圾回收

        ·%垃圾回收器只知道释放new分配的内存

        ·%无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存

        ·#一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

        ·#如果在finalize()里加入某种擦除功能,当垃圾回收发生时(不能保证一定发生),finalize()得到了调用,图像就会被擦除。(对于匿名对象,System.gc()就能引发其finalize()方法的调用)

        ·非new方式获得对象:

           ·反射机制:

               ·java.lang.Class的newInstance()方法

               ·java.lang.reflect.Constructor的newInstance()方法

           ·反序列化

           ·clone()

           对于非new方式获得对象,在类中定义一个finalize()方法

        ·Java允许在类中定义一个名为finalize()的方法。一旦垃圾回收器准备好释放对象占用的内存,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

        ·不该将finalize()作为通用的清理方法。

        ·对于匿名对象,如果在其被创建后又调用了System.gc()会引发其finalize()方法的调用

        ·Debug模式下,按F5(更详细)或F6键或F7+F8调试main()方法,会发现方法调用栈最终调用了Thread的exit()方法(使用Debug阅读源码是非常不错的)

        ·只要存储空间没有濒临用完的那一刻,对象占用的空间就总也得不到释放。如果JVM并未面临内存耗尽的那一刻,它是不会浪费时间去执行垃圾回收以恢复内存的。

        ·内存页面调度:显著地影响性能

        ·垃圾回收技术:

           ·引用计数:简单但速度很慢。引用计数器为0时,释放内存。对象之间循环引用,即便   对象应该被回收,但计数不为0。

           ·停止-复制:垃圾产生较多时,暂停程序运行,将非垃圾对象复制到新堆,新堆空间连续

               ·简单点说,你房间里不要的东西比较多时,那你就把需要的东西整理出来,这样打扫     效率高点。

           ·标记-清扫:垃圾产生较少甚至没有时,将垃圾对象标记出来清理掉,剩余空间不连续

               ·简单点说,你房间里不要的东西比较少时,那你就把不需要的东西标记出来,把它们     清理出去。

           ·自适应的、分代的、停止-复制、标记-清扫式垃圾回收器

        ·JIT:惰性评估

    5.6 成员初始化

        ·局部变量:编译器检查

        ·成员变量:

           ·默认初始化:

               ·基本类型:false,空白,0,0.0

               ·引用类型:null

           ·指定初始化:

    5.7 构造器初始化

        ·用构造器初始化字段(这些标题如“构造器初始化”起得真是乱啊)

        ·初始化在创建对象之前完成:

           ·创建对象之前的动作:

               ·加载类层次结构上的静态成员:静态字段,静态代码块;一次性的

               ·初始化字段:

               ·调用实例代码块:

               ·调用特定构造器:

    5.8 数组初始化

        ·可变参数列表:TypeName...args

    5.9 枚举类型

        ·实例:具名值|常量|大写字母(下划线)

        ·enum关键字:为enum生成对应的类时,产生了某些编译器行为

            ·编译器添加特性:

               ·toString()方法

               ·ordinal()方法:enum常量声明顺序

        ·在switch语句中使用:switch(enumType arg){case enumInstance}

  • 相关阅读:
    JS事件冒泡、事件捕获和事件委托
    实现英文字母排序
    JavaScript异步加载的四种方法
    JavaScript作用域与作用域链
    JavaScript 自定义属性 data-*
    asycn和await
    style collectd
    JavaScript如何比较两个数组的内容是否相同
    VScode插件开发--M2D文档转换插件
    BOM笔记
  • 原文地址:https://www.cnblogs.com/InformationGod/p/8514092.html
Copyright © 2011-2022 走看看