本文共 3190 字,大约阅读时间需要 10 分钟。
静态工厂方法好处:
例如:
public static Boolean valueOf(boolean f){ return b ? Boolean.TRUE : Booleab.FALSE;}Map > m=HashMap.newInstance();
静态工厂方法坏处:
当有多个构造方法,一般式参数大于4个的时候,建议使用Builder模式。
用单元素的枚举来实现单例模式。
在面向对象程序设计中,假如存在太多只有静态属性和静态方法的类;那么,面向对象的思想可能在这会损失殆尽。
但是,并不能说面向对象的程序中就不应该出现只有静态属性和静态方法的类,相反,有时候我们还必须写这样的类作为工具类。这样的类怎么实现呢?有人可能会把该类定义成抽象类(Abstract class),的确,抽象类是不可以实例化的,但是别忘了还有继承,继承了抽象类的子类在实例化时候,默认是会先调用父类无参数的构造函数的(super();),这时候,父类不是也被实例化了嘛?
其实我们可以这样做,把该类的构造函数定义为私有的(private),而类的内部又不调用该构造函数的话,就成功了。这样带来的后果就是该类成了 final的,不可能再被任何类继承了,要被继承,得提供一个公有(public)的或者保护(protect)的构造函数,这样才能被子类调用。
如果一个对象是不可变的,那么他总是可以被重用的,如:
//不推荐,"test"本来就是一个String实例,如果此方法在一个循环中或者被频繁的调用,将会严重影响性能String s = new String("test");//推荐方式String s = "test";
对于提供静态方法和构造函数的非可变类,推荐使用静态方法,这样可以避免重复创建对象,如:Boolean.vauleOf(String)方法优于构造函数Boolean(String)
类初始化的顺序:
先初始化父类的静态代码 —> 初始化子类的静态代码 —> 初始化父类的非静态代码 —> 初始化父类构造函数 —> 初始化子类非静态代码 —>初始化子类构造函数。
内存泄漏问题:如果一个对象的引用被无意识的保留起来,那么垃圾回收机制是不会去处理这个对象,而且也不会去处理被这个对象引用的其它对象。 比如堆栈的弹出栈元素方法。
public Object pop(){ if(size == 0){ throw new EmptyStackException(); } Object result = elements[--size]; //自减后把原来的引用置为null elements[size] = null; return result;}
内存泄露常出现在:
清理过期对象引用的好处是:如果在以后又被使用到该引用,最会抛下NullPointException而不是让程序继续错误的运行下去,尽可能早的监测出程序中的错误总是有好处的。
方法:重新使用这个已经指向一个对象的引用,或结束其生命周期。
(1) equals方法一般用于“值类”的情形,比如Integer,Date目的是为了比较两个指向值对象的引用的时候,希望 它们的逻辑是否相等而不是它们是否指向同一个对象。
约定:
结论:
要想在扩展一个可实例化的类的同时,即要保证增加新的特性,又要保证equals约定,建议复合优于继承原则。若类和类是 a kind of 关系则用继承,若类和类是 a part of 关系则用组合(复合)
相等的对象必须要有相等的散列码,如果违反这个约定可能导致这个类无法与某些散列值得集合结合在一起使用,所以在改写了equals方法的同时一定要重写hashCode方法以保证一致性。
toString返回值中包含所有信息
重载(overloaded method) 选择的是静态的。选择的依据是参数类型
重写(oveeridden method) 选择的依据是被调用方法所在对象的运行时的类型。
转载地址:http://ffjdl.baihongyu.com/