20170703 面向对象知识点(下)

参考文献:《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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,348评论 17 311
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,518评论 3 83
  • 《疯狂动物城》上映一周就突破1亿,强势的票房也受到了一些观看者的良好口碑。为什么疯狂动物城这么受欢迎,及时动画片又...
    嗨皮哥阅读 559评论 0 1