Java Puzzlers —— 类

a)         重载:Java重载分两个阶段运行,首先是选取所有可用的方法(构造函数),然后是在其中选择最精确的一个。(“精确”的含义是参数可选范围相对比较小。如果要求选择特定重载方法,需要把实参类型强制转换为某个方法的形参类型。重载方法是静态(编译时)选择的。理想状态下,重载是不被鼓励的。此时,像构造器可以用静态工厂方法代替,参数多得方法可以用Builder模式。
b)        静态域:每一个静态域在声明它的类 及其所有子类中共享一份单一的拷贝。
c)        静态方法:静态方法的调用不存在任何动态的分配机制。(因此静态方法是不能被重构的。)基于此,静态方法最好直接用类名调用,而不是用类实例。
d)        final:final类型的静态域在被初始化之前存在被读取值的可能性。因此需要在使用final前适当确认其已被初始化。(比如某类的一个静态域是属于本类型的(调用本类的构造函数),如果它后面有静态final域是由本类的方法初始化的,那么这个域可能就不能被初始化。
e)        instanceof:instanceof在其左操作符为null时返回false。(比如 null instanceof String)另外,instanceof要求其左右两个操作符 如果都是类的话(原书上是这么说的),必须是子类父类的关系。 (难道操作符还可以为简单类型吗?)
f)         在构造器里调用被 重构(覆写)的方法,可能导致域值未被初始化就被使用。比如创建一个子类对象Child(调用子类构造方法)时,会调用其父类Father构造函数,而Father的构造函数如果调用了某个被重构的方法,那么显然在Child构造函数中super() 语句之后初始化的域如果在那个重构的方法中被调用,就会出现“域值未被初始化就被使用”的情况。
这种情况可以用惰性初始化解决。(惰性初始化形如:
if(XXX=null){
XXX=…;
}
return XXX; 的方式。
              具体的惰性初始化的定义由于现在不能上网,还不能确定:(
g)        惰性初始化和积极初始化不要混合使用。( 待解, P119)
h)        子类构造函数中,super() 只能写在程序的第一句:如果super的参数是需要函数计算获得的,那么显然这与前面所要求的super作为第一句的说法就矛盾了。这种问题的解决:交替构造器调用机制( alternate constructor invocation)。即首先使用一个构造函数(公有,如_Constructor()),其中调用形如this(arg_fun ())的语句(在这里完成参数的计算);然后再定义一个带参数的构造函数(私有,如_Constructor(arg)),其中调用super(arg),这样问题就解决了。这样的方法实质上是一个函数的连环调用。这种 私有构造器捕获 ( Private Constructor Capture) 是一种很实用的设计模式。
i)          静态方法调用的限定表达式(如text.stat_fun()中的限定表达式是text)的值将被忽略。(比如有public static void text(), ((ClassTest)null).text();也是可以正常调用text函数的。)
j)          循环中的声明:Java不允许一个本地变量声明语句作为一条语句在while, for, do循环中重复执行。在某些编译器中这种形式(如while(true){ test_class s = test_class()})将不被通过(书上这么说,JC中可以)。v
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值