java复习笔记(二)

1. 内部类是寄存在外部类上的,普通内部类(非静态类)可以通过OuterClass.this.xxx来访问外部类的Field,即非静态内部类可以访问外部类的private成员,而外部类需要访问非静态类内部类的成员必须显示创建非静态内部类来调用。而关于静态内部类,它可以包含非静态成员,静态类说明它是直接寄存在外部类,而不是外部类对象,即静态内部类是无法访问外部类的实例成员的(与对象相连的,也就是说要新建对象时候才会初始化,或者赋值的)。新建一个非静态内部类:OutClass.In in = new OutClass().new In();当新建一个内部非静态类的时候,可以直接用外部类,而不用外部类对象了。
2. 闭包是一种能被调用的对象,它保存了创建它的作用域信息,可以把非静态内部类当做面向对象领域的闭包。
3. 枚举类的构造器只能用private修饰。所有枚举类都提供一个values()方法,方便遍历枚举类。在创建枚举类时候,枚举Field必须第一个写,中间用逗号隔开。以下给出Enum类2个例子:exam1:
public enum Gender {
MALE("男"), FEMALE("女");
private final String name;

private Gender(String name) {
this.name = name;
}

public String getName() {
return this.name;
}
}
exam2:
public enum Gender {
MALE("男"){
public void info(){
System.out.println("男性");
}
},
FEMALE("女"){
public void info(){
System.out.println("女性");
}
};
private final String name;
private Gender(String name){
this.name = name;
}
}
4. 一个对象在堆内存中有3中状态:
a. 可达状态。有引用变量引用它。
b. 可恢复状态。没有任何引用变量引用它。系统垃圾回收机制准备回收对象时候会调用所有可恢复状态对象的finalize()方法,若在方法中有引用变量重新指向给对象,则对象再次成为可达状态,否则进入不可达状态。
c. 不可达状态。经过上述过程后留下的对象,是系统真正回收的对象所占用的资源。
5. 强制垃圾回收。有两种方式认为调用:System.gc()、Runtime.getRutime().gc()。并且该方法不是表示系统立刻去执行垃圾回收,而只是一个建议,真正什么时候执行,看系统的。
6. fin alize()方法的特点:
a. 永远不要主动调用某个对象的finalize()方法,该方法应该交给垃圾回收机制调用。
b. finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当做       一定被执行的方法。
c. 当JVM执行可恢复对象的finalize()方法,可能使得该对象或系统中其他对象重新   变成可达状态。
d. 当JVM执行finalize()方法时出现异常时,垃圾回收机制不会报告异常,程序继续   执行。
7. 当用native关键词去修饰一个方法通常采用c语言来实现,同时它也破坏了Java跨平台这一特性。
8. 一个输出文件内容的比较另类的办法。算法如下:
package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Gender {
public static void main(String[] args) throwFileNotFoundException {
Scanner sc = new Scanner(new File("D://1.txt"));
while(sc.hasNextLine()){
System.out.println(sc.nextLine());
}
}
}
9. System类提供了一个方法,identityHashCode(Object object)该方法通过对象地址计算得出hashcode,而每一个类自己也都有一个hashCode()方法,加入hashCode()方法没有改写过,则这两个方法返回的hashCode是一个值,加入hashCode值相同那么一定指的是同一个对象。(比如说String类的hashCode方法就是被重写了,所以System的方法更加保证正确)。
10. Object类提供的clone机制只是“简单复制”,加入实例变量时引用类型,Object的clone机制也只是简单复制这个引用变量,这样原来对象的引用类型的实例变量与克隆对象对的引用类型的实例变量依然指向内存中同一个实例,这种“浅克隆”,只克隆该对象的所有Field值,不会对引用类型的Field值所引用的对象进行克隆。所以如果开发者要对对象进行“深克隆”,最好自己写“递归”克隆,保证所有的克隆,包括引用的对象。
11. String,StringBuffer,StringBuilder。
String:是一个不可变类,一旦创建,其中的内容就不可改变。
StringBuffer:创建后可以变化,StringBuilder与它相似,只不过StringBuffer是线程安全的,所以StringBuilder性能略高。StringBuilder有两个方法比较常见.length(),它表示字符序列的长度;.capacity()表示StringBuilder的容量,通常比length大。
12. Random类。如果两个Random对象的种子(初始化的时候给它的参数)相同,而且方法的调用顺序也相同,则它们会产生相同的数字序列。推荐采用当前时间作为Random类的种子,即 Random rand = new Random(System.currentTimeMillis());
13. BigDecimal类。这个类是为了更加精确计算而设计的。在初始化的时候,建议优先使用基于String的构造器,即BigDecimal(String val);或者通过BigDecimal.valeOf(double value);假如直接用BigDecimal big = new BigDecimal(0.05);由于0.05本来也是一个double类型,这样就又引入了精度丢失的问题。
14. Calendar类。这个类更加方便处理日期和时间,而且它是一个抽象类,通过Calendar.getInstance()来获取Calendar对象。先看下面代码:
Calendar call = Calendar.getInstance();
call.set(2003,7,23,0,0,0);//2003-8-23
也就是说设置的时候月份从0开始计算的,数字“7”代表“8”月。
call.add(MONTH,6);//2004-2-23
也就是说可以做加法的,但是呢:
call.set(2003,7,31,0,0,0);
call.add(MONTH,6);//2004-2-29
按照简单加法的话,应该是2004-2-31,但是2月没有31号,所以其实结果是29号。
Calendar容错性是可以调节的,call.setLenient(false);关闭容错性。比如说
call.set(MONTH,13);
这一语句,加入没有关闭之前会智能的将Year+1,假如关闭后会导致运行时异常。
关闭后只要超过字段的允许范围就会抛出异常,有好有坏要视具体情况定。

你可能感兴趣的:(java,枚举,内部类,垃圾回收,java常用类)