《疯狂Java讲义》7

 

昨天介绍了枚举类的相关知识,并没有讲完,我们继续!

枚举类的成员变量、方法和构造器

先定义一个枚举类,代码如下:

《疯狂Java讲义》7_第1张图片

下面通过一个程序讲述对这个类的使用:

《疯狂Java讲义》7_第2张图片

结果如下:

图片

    上面的程序使用Gender枚举类的时候与普通类没有什么很大的差别,差别只是产生Gender对象的方式不同,枚举类的实例只能是枚举值,而不是通过new随意的创建对象。

    之前提到过,枚举类比较特殊,无论是写法上还是含义上。所以,对枚举类里的实例变量 也应该有一定的要求。举个栗子:如果没什么要求,那么上面的程序中我也可以把name实例变量赋值成“男”,但是这个显然是有问题的。所以理论上枚举类里的实例变量应该是封装好的,也就是说要通过private进行修饰。此外,在枚举类中还应该对实例变量的值进行一些限定。其实说白了,枚举类就是我们描述集合所用到的列举法,它的情况应该是有限且可知的。

看下面代码:

《疯狂Java讲义》7_第3张图片

《疯狂Java讲义》7_第4张图片

上面框出来的就是解决的两点。这样子就不会发生与实际相悖的混乱。

结果如下:

图片

    上述代码看起来已经天衣无缝了,但是仍然不是最好的。枚举类通常被设计成不可变类,也就是说,它的成员变量不应该改变,这样更安全,而且代码更加简洁。因此建议将枚举类的成员变量都用private final修饰。如果用final修饰,那么必须在构造器里为这些成员变量指定初始值。因此应该为枚举类显式定义带参数的构造器。

代码如下:

《疯狂Java讲义》7_第5张图片

可能大家很不熟悉第42行的写法。

这两行相当于:

图片

对象与垃圾回收

1. 垃圾回收机制特征:

(1)垃圾回收机制只负责回收内存中的对象,不会回收任何物理资源(例如数据库连接,网络ID等资源)

(2)程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。当对象永久性的失去引用后,系统就会在合适的时候回收它。

(3)在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。

2. 对象在内存中的状态:

(1)可达状态:当一个对象被创建后,有引用变量引用它,则这个对象在程序中处于可达状态;

(2)可恢复状态:如果程序中某个对象不再有任何引用变量引用它,它就进入了可恢复状态。在这种状态下,垃圾回收机制就准备对它进行回收。但是在回收之前会调用finalize()方法进行资源清理,如果该对象被重新引用,就不回收,否则就回收。

(3)不可达状态:系统调用finalize()方法之后该对象还是没有被调用,该对象就到了不可达状态,就进行回收。

 3. finalize方法

  • finalize()方法用来清理对象的资源;

  • 方法原型为:

        protected void finalize() throws Throwable

  • 当finalize()方法返回后,对象消失,垃圾回收机制开始执行,方法原型中的throwsThrowable表示它可以抛出任何形式的异常。

  • 垃圾回收机制何时调用对象的finalize()方法是完全透明的,只有当程序认为需要更多的额外内存时,垃圾回收机制才会进行垃圾回收。因此,完全有可能出现这样一种情形:某个对象失去了引用,但是只占用了少量内存,而且系统没有产生严重的内存需求,因此垃圾回收机制并没有试图回收该对象所占用的资源,所以该对象的finalize()方法不会得到调用。

  • finalize()方法有4个特点:

    (1)永远不要调用某个对象的finalize()方法,该方法应该交给垃圾回收机制调用。

    (2)finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当作一定会执行的方法。

    (3)当JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中其他对象重新变成可达状态。

    (4)当JVM执行finalize()方法时出现异常时,垃圾回收机制不会报告异常,程序继续执行。

使用JAR文件

 1. JAR文件的全称是JavaArchiveFile,意思就是Java档案文件。通常JAR文件是一个压缩文件,与常见的ZIP压缩文件兼容,通常也被称为JAR包。JAR文件与ZIP压缩文件的区别是:JAR文件中默认包含了一个名为META-INF/MANIFEST.MF的清单文件,这个清单文件是生成JAR文件时由系统自动创建的。

2. JAR文件的作用:

    当开发了一个应用程序之后,这个应用程序包含了很多类,如果需要把这个应用程序提供给别人使用,通常会把这些类文件打包成一个JAR文件,把这个JAR文件给别人使用。只要别人在自己的系统里面的CLASSPATH环境变量中添加这个JAR文件,则Java虚拟机就可以自动在内存中解压这个JAR包,然后进行使用。

3. JAR文件的好处:

(1)安全:能够对JAR文件进行数字签名,只让能够识别数字签名的用户使用里面的东西;

(2)加快下载速度:在网上使用Applet时,如果存在多个文件而不打包,为了能够把每个文件都下载到客户端,需要为每个文件单独建立一个HTTP连接,这是非常耗时的工作。但是打包以后,只需要建立一个HTTP连接即可;

(3)压缩

(4)包封装

(5)可移植性

 

《疯狂Java讲义》7_第6张图片

【2017.07】

好了,今天java就到这里吧,下面本来是JAR包的使用,可是我怎么就这么不想看呢。明天学习第七章吧——Java基础类库。感觉现在看起来学的都是些理论上的东西,但是还是有很大帮助的,知道了很多机理以后,无论是看代码还是写代码都会考虑更多,让程序更加健壮,所以还是有必要的。不希望自己一直纸上谈兵,所以我把书上的程序都敲过一遍,会不会再说,首先混个手熟。加油吧,今天应该可以敲敲代码,弄弄竞赛题。对了,说个有意思的事情,我今天打开公众号,发现老爸给了我个消息,是一个表情,头晕眼花的那个,顿时觉得好好玩啊爸爸,太有意思了。不过这个可能在提醒我,只发专业东西不是太好的,可以多面性!get it!

你可能感兴趣的:(Java,java,编程语言)