1. 用构造器确保初始化

    • 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器。
    • 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格"。
    • 构造器默认调用的是无参构造方法
    • 构造器没有返回值,与返回值为空(void)不同。
  2. 方法重载
    • 方法名相同,形式参数不同的方法为重载方法。
    • 每个重载的方法都必须有一个独一无二的参数类型列表。
    • 参数顺序的不同也可以实现重载,但会使得程序难以维护。
    • 如果传入的实际参数大于重载方法声明的形式参数,就必须通过类型转换来执行窄化转换。
    • 以返回值区分重载方法,在某些场合可能无法执行。比如仅执行一个方法,而不将其赋值给某个类型,则无法判断需要调用哪个返回类型的重载方法。
  3. 默认构造器
    • 又称为无参构造器,用于创建一个默认对象。
    • 如果没有定义构造方法,则编译器会自动创建默认构造器。
    • 但是如果定义了一个构造器(无论是否有参数),编译器将不会自动创建默认构造器。
  4. this关键字
    • this关键字只能在方法内部使用,表示对调用该方法的对象的引用。
    • 如果在方法内部调用同一个类的方法,则this可以省略。
    • this关键字还可以将当前对象传递给其他方法。
    • this()可以实现在构造器中调用构造器,但是必须置于最起始处。
    • static的方法就是没有this的方法。
  5. 终结处理和垃圾回收
    • Java的垃圾回收机制值能回收通过new创建的对象。
    • Java在垃圾回收之前会调用finalize()方法,因此可以在此方法中做一些清理工作。
    • 只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总得不到释放。
    • 垃圾回收只与内存有关
      • 使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。
      • 垃圾回收器会自动释放由new创建的对象所分配的所有内存空间
      • 如果在JAVA中使用了"本地方法"(Java中调用非Java代码),非Java代码所申请的内存空间无法被回收器直接回收,因此需要将释放方法放在finalize()方法中。
    • Java中不允许创建局部对象,也不存在delete用于释放对象。
    • 重点:java9.0.1中已经弃用了finalize()方法!
  6. 垃圾回收器如何工作
    • 主要思想:对任何"活"的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。因此从堆栈和静态存储区开始,遍历所有引用,就能找到活的对象。
    • 停止-复制方式:从堆栈和静态存储区开始,遍历所有引用,找到活的对象。暂停程序的运行,将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。回收完成后,新堆保持紧凑排列,因此会使得之后的分配工作变得简单。
    • 标记-清扫方式:从堆栈和静态存储区开始,遍历所有引用,找到活的对象。将活的对象标记,然后清扫没有标记的对象。适合于只产生少量垃圾的情况。
    • 该部分未理解,后期再读
  7. 成员初始化
    • 方法的局部变量,如果没有显式初始化,则编译器会报错。
    • 类的成员变量,会自动赋予默认初始值。
    • 类里定义一个对象引用时,如果不初始化,该引用会获得一个特殊值null。
  8. 构造器初始化
    • 在执行构造器初始化之前,首先会将类中散落的所有变量进行默认初始化。
    • 无论创建多少个对象,静态数据都只占一份存储区域。static不能用于局部变量。
    • 静态对象,只有在必要时刻才会进行初始化,并且只会初始化一次。
    • 初始化的顺序:先静态对象,然后是非静态对象。
    • 构造器实际上是静态方法。
    • 对象的创建过程
      • 首次创建某个类的对象,或调用某个类的静态方法/成员时,Java会寻找.class文件,将其加载到方法区内存,此时会初始化静态对象。
      • 当用new创建对象的时候,首先将在堆中为其分配足够的空间,然后将空间清零。
      • 然后执行所有成员变量的初始化操作。
      • 最后执行构造器。
  9. 数组初始化
    • 定义时初始化

      • 用花括号将元素括起来。
      • new int[size]也可以初始化。
    • 每一个数组都有一个固有成员length,如果访问过界,会出现运行时错误。
    • 对于引用数组,如果试图使用数组中的空引用,就会在运行时产生异常。
    • 通过创建Object[]数组,可以应用于数组元素类型未确定的场合。
    • 通过类型...变量名可以实现可变参数列表。
    • 最好只在重载方法的某一个方法上使用可变参数列表。
  10. 枚举类型
    • enum枚举类型的实例是常量,一般全部用大写表示。

初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理的更多相关文章

  1. 初读"Thinking in Java"读书笔记之第七章 --- 复用类

    组合语法 将对象引用置于新类中,即形成类的组合. 引用初始化方法 在定义处初始化. 在类的构造器中初始化. 在使用这些对象之前,进行"惰性初始化". 使用实例初始化. 继承语法 J ...

  2. 初读"Thinking in Java"读书笔记之第六章 --- 访问权限控制

    包:库单元 包内包含有一组类,他们在单一的名字空间下被组织在一起. 通过import ***.***.*可以将某个包下的所有类导入到当前文件中. 每个Java源文件最多只能有一个public类,且名称 ...

  3. 初读"Thinking in Java"读书笔记之第四章 ---控制执行流程

    true和false Java不允许将数字作为布尔值使用. 所有条件表达式都将布尔值作为判断条件,决定执行路径. if-lese 迭代 while,do-while,for为三个迭代语句. ,逗号操作 ...

  4. 初读"Thinking in Java"读书笔记之第三章 --- 操作符

    更简单的打印语句 导入自己编写的静态类库,即可使用print();打印 使用Java操作符 操作符:+,-,*,/,=,==,!=,+=,?:,%等 几乎所有操作符都只能操作"基本类型&qu ...

  5. 初读"Thinking in Java"读书笔记之第二章 --- 一切都是对象

    用引用操纵对象 Java里一切都被视为对象,通过操纵对象的一个"引用"来操纵对象. 例如, 可以将遥控器视为引用,电视机视为对象. 创建一个引用,不一定需要有一个对象与之关联,但此 ...

  6. 初读"Thinking in Java"读书笔记之第九章 --- 接口

    抽象类和抽象方法 abstract void f();抽象方法是仅有声明而没有方法体的方法. 包含抽象方法的类叫做抽象类,如果一个类包含了一个抽象方法,则该类必须限定为抽象类. 抽象类和抽象方法可以使 ...

  7. 初读"Thinking in Java"读书笔记之第八章 --- 多态

    再论向上转型 在某些方法中,仅接收基类作为参数,而不是特殊的导出类,会使得程序更容易扩展. 转机 方法调用绑定 前期绑定(编译期绑定):在编译期将一个方法调用和方法主体关联起来. 后期绑定(动态绑定或 ...

  8. Think In Java读书笔记:内部类覆盖及其初始化

    本文相关章节:第十章 内部类 10.10 内部类可以被覆盖吗 在读至本节第二个范例代码时(及下方的代码),我对输出结果中的第一个“Egg.Yolk()”很不理解,为什么它会第一个地方输出. 我起初认为 ...

  9. 【Head First Java 读书笔记】(五)编写程序

    第五章 编写程序 伪码:伪码能帮你专注于逻辑而不需要顾虑到程序语法 测试码:测试用的程序代码 真实码:实际代码 伪码 伪码是介于真正的java程序与正常英语之间的一种语言.伪码大致包括3部分:实例变量 ...

随机推荐

  1. leetcode算法题01

    最近求职需要重新刷算法题,从今天开始每天至少做一个leatcode的题 如果有更好的算法或者换了语言也会更新 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只 ...

  2. Pycharm快捷键设置(鼠标滚动控制字体大小)

    一.pycharm字体放大的设置 File —> setting —> Keymap —>在搜寻框中输入:increase —> Increase Font Size(双击) ...

  3. Redis(一)--安装与简介

    1.Redis是用c编写的,刚开始只支持linux,后来又团队开发出了windows版本:Redis属于非关系型数据库,key-value格式,传统关系型数据库处理高并发.海量数据存储和访问.高可扩展 ...

  4. webdirver.Chrom() selenium webdirver调用谷歌浏览器的问题解决

    第一个坑: 没有将谷歌驱动放到   /usr/local/bin  目录下 第二个坑: 没有将谷歌浏览器.exe放在    /usr/local/bin  目录下(注意:驱动和浏览器在一个路径下才能使 ...

  5. Python 入门小实例笔记

    实例1:打印用户输入的姓名与手机号码知识点:编码,获取输入,变量,标准输出 #encoding=utf-8 import time #1.提示用户输入信息 name = input ("请输 ...

  6. GT sport赛道详解 - 富士国际赛车场

    练了3-4个小时,最好的成绩只有2'09多,这5秒真的很难跨越,很是绝望,感觉碰到瓶颈了. 看了几个视频,发现大家的走线有些差异,但是切apx的极速都是一样的,所以在复合弯道,走线其实不止一种. 分析 ...

  7. pgsql 服务遇见的问题记录

    1.安装服务 命令 pg_ctl.exe register -N "pgsql" -D ../data 2.安装后启动失败的解决方式 2.1删除data文件夹下的postmaste ...

  8. (最完美)红米手机5的Usb调试模式在哪里打开的教程

    就在我们使用安卓手机接通PC的时候,或者使用的有些app比如我们企业营销部门就在使用的app引号精灵,之前老版本就需要开启usb开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启usb开发者 ...

  9. ES9新内容概括

    本文主要介绍ES2018 新出的一些特性 1.异步迭代 允许 async/await 与 for-of 一起使用,以串行的方式运行异步操作,达到异步函数的迭代效果. async function pr ...

  10. ELK原理与介绍

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...