5.1 用构造器确保初始化
初始化和清理,是程序错误的源头。
构造函数 constructor 无返回值,跟类同名。
Dog d = new Dog(); new表达式返回了新对象的引用
5.2 方法重载
方法名相同,形参不同,构成不同的函数。
[1] 参数类型不同 f(inta) 与 f(double b)不同
[2] 参数不同类型顺序不同 f(int a,double b) f(doubleb,int a),但尽量不用
[3] 以返回值区分重载方法是不可行的
对于基本类型传参,f(int a)传double类型必须显示转换。如果反过来,会自动提升数据类型f(double b),可传入int short各种。char直接提升为int。
5.3 默认构造器
如果你的类没有写构造器,编译器会自动帮你创建一个默认的构造器 无参数的。
如果你定义了一个构造器,且有参数的。编译器不会再给你创建无参数的构造器。
5.4 this关键字
同一个类型对象a,b调用一个方法,如何知道是哪个调用的,this指针,在方法内部,表示“调用方法的那个对象”的引用。
只有当需要明确指出当前对象的引用时,才需要使用this关键字。
this 完成在构造器中调用构造器
FlowerThis(int petals,String s){
this(petals);
//! this(s);一个构造函数中不能调用两次
this.s=s;//this的用法,形参和字段变量同名时
}
FlowerThis(){
this(5,"String");
}
static 方法,就是没有this的方法。static方法中不能调用非静态方法,反之可以。static类似于全局函数。
在使用static方法时,由于不存在this,所以不是通过“向对象发送消息”的方式来完成的。?
5.5 清理:终结清理和垃圾回收
垃圾回收器,只释放那些经由new分配的内存,其他的内存不会处理。
java允许在类中定义一个finalize()方法,原理,一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并在下一次垃圾回收动作发生时,才会真正回收对象占用内存。
垃圾回收本身也是有开销的。
finalize()真正用途:使用了创建对象之外的方式为对象分配了存储空间。使用本地方法(在java代码中调用非java代码的方式)的情况。
无论是垃圾回收,还是finalize都不保证一定会发生。要想进行除释放空间之外的清理工作,需要明确调用某个恰当的java方法。
finalize的另一个用途:终结条件验证。如果某个对象要被清理掉了,它该处于一个安全状态。
System.gc() 用于强制进行终结动作。但是finalize不总会被调用,例如书上的例子。
垃圾回收器如何工作,有待于进一步看。但垃圾回收器提高了对象的创建速度。
5.6 成员初始化
所有变量在使用之前要保证初始化,否则会报错。
但在类的数据成员,即字段,会默认初始化一个值,int=0,Dogd;引用获得值为null。
每次赋初值,保证了程序的正常运行,但牺牲了灵活性。
5.7构造器初始化
可以通过构造器初始化
初始化顺序:一个类中的字段,在创建对象时,先初始化字段的值,在调用构造函数,无论字段在构造函数之前还是之后定义。
静态数据初始化:无论创建多少个对象,静态数据都只占一份存储区域。static关键字不能应用于局部变量,因为它只能作用于域。
静态初始化只有在必要时刻才会进行。到第一个对象被创建或者第一次静态访问时,才会被初始化,之后不会被初始化第二次。
初始化的顺序,先静态对象,然后是非静态对象。
显示的静态初始化:允许为静态变量,组成特殊的静态块。
public class Spoon{
staticint ;
static{ i=47; }
}
这段代码只执行一次(当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时【即便从未生成过那个类的对象】。)
5.8 数组初始化
数组定义:
int[] a = {1,2,};//逗号可要可不要
int[] a = new int[10];
String[] s = new String[]{“a”,”b”}
int[] a1 =a; //赋值引用
Other[] os = new Other[10]; 对象数组定义
Arrays.toString(a),将数组转换成可打印版本,a的输出为: [1,2]
可变参数列表:
static void printArgs(Object[] args){} 可以传入任意个数,但是必须要printArgs(newObject[]{1,…. });
static void f(int a,String... trailing){} ,可以不用显式的写数组语法,编译器会自动填充数组。f(1,“a”,“b”);
可变参数列表,在重载时容易出现问题,可以增加一个非可变参数来解决,或者重载时不要用可变参数。
5.9 枚举类型
public enum Money{//类似于一个类
ONE,TWO,FIVE,TEN,TWENTY,FIFTY,HUNDRED
}//里边用大写
Money m = Money.ONE; //定义数据类型
for(Money n : Money.values()){
System.out.println(n+" ordinal:"+n.ordinal());
}
staticvalues(),按照enum常量的声明顺序,产生由这些常量值构成的数组。
ordinal返回某个特定enum的声明顺序,从0开始。
enum与switch一起使用,较为方便。
垃圾回收器极大的简化了编程工作,而且处理内存也安全,但是确实增加了运行时的开销,java解释器也非常慢,所以到底这种开销造成何种影响很难断定。但随着时间发展,java性能在不断提升。