《疯狂JAVA》读书笔记-第六章面向对象(下)

本章要点:包装类及其用法、内部类、枚举类、Lambda表达式、接口、抽象类和垃圾回收等

  1. -128-127,在用包装类Integer a=2 ;Integer b=2; a==b;是相关等的,因为jdk1.5后,有一个自动装箱的特性,在new Inteager(2)的时候,其实都是引用了预先示例好的一个cacahe数组,范围是-128到127。当定义超出这个范围的数时,两个对象就是不等(不同的)对象了。

  2. 常量池:在编译时就确定下来并保存在.class文件中的常量(包括了类、方法、接口的常量和字符串常量)。

    • 构造器:创建对象的根本途径,每个类都有一个默认无参的构造器(隐式返回该类实例)
    • 成员变量:可用public、protected、private、static和final修饰
    • 方法:可用public、protected、private、static、final和abstract修饰,但final和abstract只能出现其一
  3. 单例类:一个类只允许创建一个实例。因为不能给自由创建对象,所以构造器方法必须private,因此又需提供一个返回该类对象的方法(因为在此之前是没对象的,所以方法必须为static,属于类方法),而且创建过的对象必须静态缓存起来,所以对象的成员变量是static修饰的。

  4. final关键字(程序员显式初始化后不可更改,系统不会隐式初始化)

    • 类变量:静态代码块和初始化变量时指定

    • 实例变量:普通代码块、指定变量时或者构造器中指定

    • 修饰基本类型和引用变量的区别:基本类型不可重新赋值,引用变量由于是执行一个地址,所指向的对象可重新赋值,地址不可。

    • 不可变类:创建该类后,该类的实例变量不可变。遵循以下规则:

      • 使用private和final来修饰成员变量
      • 提供构造器,传入参数方式初始化值
      • 只提供get方法,不提供set方法
    • 抽象类

      • 用abstract修饰
      • 不能实例化(不能用new创建),即使不含抽象方法
      • 含抽象方法
      • final(static)和abstract永远不能同时被使用
    • 接口

      • 所有的方法都是抽象方法,java8改进接口,允许定义默认方法,提供方法的实现。
    • 接口和抽象类区别:

      • 接口和抽象类都不能被实例化
      • 都可包含抽象方法,且实现接口和继承抽象类都必须实现这些抽象方法
      • 接口不可定义普通成员变量,只可定义静态常量。
      • 接口只能包含默认方法和抽象方法,而抽象类可包含普通方法
      • 接口不含有构造器,但是抽象类型可以含有构造器,但不是创建对象的,而且为了完成给子类调用完成抽象类的实例初始化工作。
      • 可以实现多个接口,抽象类只能单继承。
    • 内部类

      • 非静态内部类不能用户静态成员
      • 内部类可以访问外部的私有成员,但是外部类不能访问内部类的实现细节
      • 内部类比外部类多了三个修饰:private,protected,static
      • 内部类是类成员,匿名内部类和局部内部类则不是
      • 静态内部类,属于外部类而不属于外部类的对象。
      • 静态内部类只能访问外部类的静态成员。即使是静态内部类的实例访问也不能访问外部类的非静态成员。
    • 局部内部类:在方法里面定义的类。

    • 匿名内部类:只需执行一次调用。必须实现接口或者继承一个父类,无类名,所以无构造器。不能是抽象类,因为匿名内部类必须初始化实例对象。

    • lambda表达式:

      • 目标类型必须是函数式接口(只包含一个抽象方法的接口)
    • 枚举类:实例有限且固定的类

      • 默认继承java.lang.Enum类,不能显式继承其他类
      • 使用enum定义的非抽象类,是用final修饰的,因此不能派生子类
      • 构造器的访问级别必须是private
      • 枚举类的所有实例必须在第一行显式列出
      • 不能随便用new创建对象,一般用valueOf
    • 对象与垃圾回收

      • 只回收堆内存中的对象,不回收物理资源

      • 无法精准控制回收时机

      • 回收前总会调用finalize()方法,该方法可能使对象重新引用而取消了回收

      • 对象在内存中的状态

        1555545311668

    • 强制回收:System.gc()或者Runtime.getRumtime.gc(),建议系统去回收(并不是马上)

    • 对象的强、软、弱、虚引用

      • 强引用:正常的创建对象,并赋给引用变量的情况
      • 软引用:通过SoftRefernce实现,内存足够时不会被回收,反之才回收
      • 弱引用:通过WeakReference实现,当进行垃圾回收时,总会被回收
      • 虚引用:通过PhantomReference实现,跟没引用差不多,不能单独使用,要结合引用队列
    • 修饰符使用范围

      • strictfp 让浮点更精确,可以修饰类,接口和方法
    • jar包相关

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 谭家俊
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

微信