第五章 初始化与清理


在这里插入图片描述

1.用构造器确保初始化
  1. 构造器与类同名
  2. 在操作对象前,已为对象分配内存空间,并调用相应构造器对象已被初始化了
2.方法重载
  1. 构造器/方法名相同,形式参数不同(参数列表不同)包括参数顺序不同
3.默认构造器(无参构造器)
  1. 如果你写的一个类中没有构造器,则编译器会自动帮你船舰一个默认构造器
  2. 如果你已经定义了一个构造器(无论有参还是无参),编译器就不会自动创建无参构造器了
4.this关键字
  1. this关键字表示:“调用方法的那个对象”的引用

  2. 通常写this的时候,都是指“这个对象”或“当前对象”而且它本身表示对当前对象的引用

  3. static含义

    (1).在没有创建任何对象的前提下,仅通过类本身,就可以调用static方法
    (2).static方法就是没有this的方法

5.清理
  1. 对象可能不被垃圾回收
  2. 垃圾回收并不等于“析构”
  3. 垃圾回收只与内存有关
  4. finialize()用途
  • 使用垃圾回收的唯一原因是为了回收程序不再使用的内存
  1. 垃圾回收机器如何工作

    (1) 垃圾回收机器可以提高对象创建速度

    (2) JVM中,它像一个传送带,每分配一个新对象,垃圾回收机器就往前移一格

    (3) 一面回收空间,一面使堆中的对象排列更加紧凑

    (4) 实现了一种高速的,有无限空间可以无限分配的堆模型

    (5) 垃圾回收机制
    i.引用计数
         1.简单速度慢(不被JVM应用)
         2.每个对象都有一个计数器,当有引用连接至对象时,引用计数加1,当引用离开作用域时被置null,引用计数减1
ii.停止—复制
		 1.先暂停程序运行,将存活的对象从当前堆复制到新堆中,没复制的就是垃圾。在新堆中,对象是紧凑排列的。
         2.缺陷:
           a.效率低:需要两个堆,维护需要比实际多一倍空间
           b.复制问题:程序稳定运行后,垃圾很少,仍将内存从一处复制到另一处的浪费
iii.标记—清扫
         1. 当没有垃圾的时候用此模式
         2. 遍历所有引用,每找到一个存活对象就标记,待标记工作完成,开始清理未标记对象
iv.自适应
         1.JVM中,内存分配以比较大的“块”为单位,垃圾回收器,在回收的时候往废弃“块”里拷贝对象。如果“块”在某处被引用“代数”增加;垃圾回收器会整理上次回收动作后的块。
         2.大型对象不会被复制,小型对象会被复制并整理。
         3.JVM监视所有对象稳定,垃圾回收效率低的话,自动切换至“标记—清扫“方式。
         4.若堆空间出现很多碎片,自动切换至”停止—复制“方式
v.”即时“编译
         1.将程序翻译成本地机器码,提高速度
         2.当需要装载某个类时,编译器会找到其class文件,然后将类的字节码加入到内存中
         3.即时编译器,会编译所有代码。缺陷:
           a.这种加载动作散落在整个程序生命周期内,累加起来更费时间
           b.会增加代码长度,导致页面调度,降低程序速度
vi.惰性评估

​ 即时编译器只在必要时,才会编译代码

6.成员初始化
  1. 局部变量,强制程序员提供初始化
  2. 类的成员变量(即字段)是基本类型,编译器会给一个默认值
7.构造器初始化
静态数据初始化
  1. 无论创建多少个对象,静态数据都只占用一份存储空间
  2. static关键字不能应用于局部,因此它只能作用于域
  3. 如果一个域时静态基本类型域,且没有对他进行初始化,那么它就会获得基本类型的标准初值
  4. 如果它是一个对象引用,那么它的默认初始化值就是null
  5. 初始化顺序:先”静态“对象;后”非静态“对象
  6. 静态初始化只在class对象首次加载的时候进行一次
8.初始化数组
可变参数列表
  1. 不确定参数的个数时,可以使用可变的参数列表
  2. 语法:参数类型 …(三个点)
    例如:void printArray (Object …)
  3. 作用:有了可变参数,就再也不用显示的编写数组语法了。当你指定参数时,编译器实际上会为你去填充数组
  4. 可变参数列表与自动包装机制可以和谐共处
9.枚举类型(enum)
  1. 例:

    public enum Spiciness {
      NOT, MILD, MEDIUM, HOT, FLAMING
    } 
    
  2. 这里创建了名为Spiciness的枚举类型,由于枚举类型的实例都是常量,因此用大写字母表示(多个文字下划线分割)

  3. 创建enum时,编译器会:

    (1)创建 toString() 方法:方便显示enum实例名
    (2)创建 ordinal() 方法:表示enum的声明顺序
    (3)创建 static valuse() 方法:按照enum常量的声明顺序,产生由这些常量值构成的数组

  4. enum可以在switch语句中使用,

    public class Burrito {
      Spiciness degree;
      public Burrito(Spiciness degree) { this.degree = degree;}
      public void describe() {
    	System.out.print("This burrito is ");
    	switch(degree) {
    	  case NOT:    System.out.println("not spicy at all.");
    				   break;
    	  case MILD:
    	  case MEDIUM: System.out.println("a little hot.");
    				   break;
    	  case HOT:
    	  case FLAMING:
    	  default:     System.out.println("maybe too hot.");
    	}
      }	
      public static void main(String[] args) {
    	Burrito
    	  plain = new Burrito(Spiciness.NOT),
    	  greenChile = new Burrito(Spiciness.MEDIUM),
    	  jalapeno = new Burrito(Spiciness.HOT);
    	plain.describe();
    	greenChile.describe();
    	jalapeno.describe();
      }
    }
    
  • 23
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进阶的小名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值