参考文献:《Java疯狂讲义》(第三版)
面向对象知识点(下)
Java8增强的包装类:
知识点:
常量池用来专门管理在编译时被确定并保存在已编译的.class
文件中的一些数据。它包括了关于类、方法、接口中的产量,还
包括字符串常量。
单例类(单例模式)
定义:如果一个类始终只能创建一个实例,则这个类被称为单例
类。
使用:将所有构造器用private修饰,该类还必须缓存已经创建
的对象,否则该类无法知道是否曾经创建过对象,也就无法保证
之创建一个对象。为此还需要使用一个成员变量(静态)来保存
曾经创建的对象,因为该成员变量需要被上面的静态方法访问,
故该成员变量必须使用static修饰。
final变量:
与普通成员变量不同的是,final成员变量(包括实例
变量和类变量)必须由程序员显示初始化,系统不会对final成员
进行隐式初始化
注:当使用final修饰基本类型变量时,不能对基本类型变量重新
赋值。
知识点:
final修饰符的一个重要用途就是定义“宏变量”。当定义
final变量时就为该变量指定了初始值,而且该初始值可以在编译
时就确定下来,那么这个final变量本质上就是一个“宏变量”,
编译器会把程序中所有用到该变量的地方直接替换成该变量的值
。
知识点:
Java会使用常量池来管理曾经用过的字符串直接量,例如执
行String a=“java”,常量池中就会缓存一个字符串“java”
;如果程序再次执行String b="java",系统会让b直接指向常量
池中的“java”字符串,因此a==b将会返回true。
知识点:
对于实例变量而言,既可以在定义该变量时赋初始值,在这
三个地方指定初始值的效果基本一样。但对于final实例变量而言
,只有在定义该变量时指定初始值才会有"宏变量"的效果
知识点:
盲目乱用缓存也可能可能导致系统性能下降,缓存的对象就
会占用系统内存,如果某个对象只使用一次,重复使用的概率不
大,缓存该实例就会弊大于利;反之,如果某个对象需要频繁的
重复使用,缓存该实例就利大于弊。
抽象类Abstract
抽象方法和抽象类规则如下:
1、抽象类必须使用abstract修饰符来修饰,抽象方法也必须使
用abstract修饰符来修饰,抽象方法不能有方法体;
2、抽象类不能被实例化,无法使用new关键字来调用抽象类的
构造器创建抽象类实例。(技巧:匿名内部类方法)
3、抽象类可以包含成员变量、方法、构造器、初始化块、内部
类(接口、枚举)5种成份;
4、含有抽象方法的类只能被定义为抽象类;
知识点:abstract不能用于修饰成员变量、局部变量、构造器
接口:
知识点:
接口里定义的内部类、内部接口、内部枚举默认都采用
public static 两个修饰符,不管定义时是否指定这两个修饰符,
系统都会自动使用public static对它们进行修饰;
面向接口编程:
简单工程模式、命令模式
知识点:
设计模式就是对经常出现的软件设计问题的成熟解决方案,
很多人把设计模式想象成非常高深的概念,实际上设计模式仅仅
是对特定问题的一种惯性思维。
设计模式的理解必须以足够的代码积累作为基础。最好是经
历过某种苦痛,或者正在经历一种苦痛,就会对设计模式有较深
的感受。
命令模式:
场景:某个方法需要完成某个行为,但具体行为实现无法确定,
必须等到执行该方法时才可以确定。
知识点:
在某些编程语言(如Ruby等)里,确实允许传入一个代码块
作为参数。现在Java8中已经增加了Lambda表达式,通过
Lambda表达式可以传入代码块作为参数
可以考虑设置一个接口Command来定义一个方法,用这个方法
来“处理行为”。
知识点:非静态内部类里不可以有静态初始化块,但可以包含普
通初始化块。非静态内部类普通初始化块的作用与外部类初始化
块作用完全相同
Java8新增的Lambda表达式
1、形参列表
2、箭头:"->"
3、代码块
作用:取代匿名内部类
对象与垃圾回收
1、垃圾回收机制只负责回收堆内存中的对象,不会回收任何物
理资源;
2、程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时
候进行。当对象永久地失去引用后,系统就会在合适的时候回收
它所占的内存。
3、在垃圾回收机制回收任何对象之前,总会先调用它的finalize
()方法,该该方法可能使该对象重新复活,从而导致垃圾回收
机制取消回收。
对象在内存中的状态
1、可达状态:当一个对象被创建后,若有一个以上的引用变量
引用它,则这个对象在程序中处于可达状态,程序可通过引用变
量来调用该对象的实例变量和方法。
2、可恢复状态:如果程序中某个对象不再有任何引用变量引用
它,它就进入了可恢复状态。在这种状态下,系统的垃圾回收机
制准备回收该对象所占用的内存,在回收该对象之前,系统会调
用所有可恢复状态对象的finalize方法进行资源清理。如果系统
在调用finalize()方法时重新让一个引用变量引用该对象,则这个
对象会再次变为可达状态:否则该对象将进入不可达状态。
3、不可达状态:当对象与所有引用变量的关联都被切断,且系
统已经调用所有对象的finalize()方法后依然没有使该对象变成可
达状态,那么这个对象将永久性地失去引用,最后变成不可达状
态。只有当一个对象处于不可达状态时,系统才会真正回收该对
象所占有的资源。
强制垃圾回收:
1、调用System类中的gc()静态方法:System.gc();
2、调用Runtime对象的gc()实例方法:Runtime.getRuntime
().gc();
finalize方法
在垃圾回收机制回收某个对象所占用的内存之前,通常要求
程序调用适当的方法来清理资源,在没有明确指定清理资源的情
况下,Java提供了默认机制来清理该对象的资源,这个机制就是
finalize()方法
当finalize方法返回后,对象消失,垃圾回收机制开始执行。
finalize()方法4个特点:
1、永远不要主动调用某个对象finalize()方法,该方法应当交
给垃圾回收机制调用。
2、finalize方法何时被调用,是否被调用具有不确定性,不要把
finalize()方法当成一定会被执行的方法;
3、当JVM执行可恢复对象的finalize()方法时,可能使该对象
或系统中其他对象重新变成可达状态。
4、当JVM执行finalize方法时出现异常时,垃圾回收机制不会报
告错误,程序继续执行
对象的软、弱和虚引用
1、强引用:
这时Java程序最常见的引用。程序创建一个对象,并把这个
对象赋给一个引用变量,程序通过该引用变量来操作实际的对象
,前面介绍的对象和数组都采用了这种强引用的方式。当一个对
象被一个或一个以上的引用变量所引用时,它处于可达状态,不
可能被系统垃圾回收机制回收。
2、软引用
软引用需要通过SoftReference类来实现,当一个对象只有软
引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象
而言,当系统内存空间足够时,它不会被系统回收,程序也可使
用该对象;当系统内存空间不足时,系统可能回收它。软引用通
常对于内存敏感的程序中。
3、弱引用:
弱引用通过WeakReference类实现,弱引用和软引用很像,
但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统
垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象
所占用的内存,当然,并不是说当一个对象只有弱引用时,它就
会立即被回收——正如那些失去引用的对象而言,必须等到系
统垃圾回收机制运行时才会被回收。
4、虚引用
虚引用通过PhantomReference类实现,虚引用完全类似于
没有引用。虚引用对对象本身没有太大影响,对象甚至感觉不到
虚引用的存在。如果一个对象只有虚引用时,那么它和没有引用
的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,
虚引用不能单独使用,虚引用必须和引用队列联合使用。
上面三个引用类都包含get方法,用于获取被它们所引用的对
象。
引用队列由java.lang.ref.ReferenceQueue类表示,它用于
保存被回收后对象的引用。当联合使用软引用、弱引用和引用队
列时,系统在回收被引用的对象之后,将把被回收对象对应的引
用添加到关联的引用队列中。
与软引用和弱引用不同的是,虚引用在对象被释放之前,将
把它对应的虚引用添加到它关联的引用队列中,这使得可以在对
象被回收之前采取行动。
弱引用和软引用可以单独使用,但虚引用不能单独使用,单
独使用虚引用没有太大的意义。虚引用的主要作用就是跟踪对象
被垃圾回收的状态,程序可以通过检查虚引用关联的引用队列中
是否已经包含了该虚引用,从而了解虚引用所引用的对象是否即
将被回收。
弱引用所引用的对象被系统垃圾回收过程
import java.lang.ref.*;
public class ReferenceTest{
public static void main(String[] arge)
throws Exception
{
String str=new String("Java疯狂讲义");
WeakReference wr=new WeakReference(str); //1
//切断str引用和疯狂Java讲义字符串之间的引用
str=null; //2
System.out.println(wr.get());//3
//强制垃圾回收
System.gc();
System.runFinalization();
//再次取出弱引用所引用的对象
System.out.println(wr.get()); //4
}
}
1、创建“疯狂Java讲义”字符串对象,并让str字符串引用变量
引用他,执行1行代码时,系统创建了一个弱引用对象,并让该
对象和str引用同一个对象。
2、当程序执行到第2行代码时,程序切断了str和“疯狂Java讲
义”字符串对象之间的引用关系;
3、当程序执行到3号粗体字代码时,由于本程序不会导致内存
紧张,此时程序通常还不会回收弱引用wr所引用的对象,因此
在3号代码处可以看到输出“疯狂Java讲义”字符串
4、之后调用了gc()方法和runFinalization()方法,通知系
统进行垃圾回收,如果系统立即进行垃圾回收,那么就会将弱引
用wr所引用的对象回收。接下来在4代码处看到输出null
作用:
使用这些引用类可以避免在程序执行期间将对象留在内存中
,如果以软引用、弱引用或虚引用的方式引用对象,垃圾回收期
就能够随意地释放对象。如果希望尽可能减小程序在其生命周期
中所占用的内存大小时,这些引用类就很有用处。
Jar文件
知识点:jar是随JDK自动安装的,在JDK安装目录下的bin目录
中,运行它需要用到JDK安装目录中lib目录中的tools.jar文件
,通常系统会自动加载tools.jar,无需显式设置
jar命令的用法
1、创建jar文件:jar cf 名称.jar 类
2、创建jar文件,并显示压缩过程:jar cvf 名称.jar 类民
3、不使用清单文件:jar cvfM test.jar test
4、自定义清单文件内容:jar cvfm test.jar manifest.mf test