在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的有关问题

在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的问题。
“在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的问题。“
这句话是think in java中的话。
我的疑问是static方法呢? 为什么说构造器中唯一能够安全调用的方法是final方法。static方法我觉得同样会安全。


------解决思路----------------------
final说明是 这个一个已经是终极的了,不可能在改变了, private说明只能这个类使用,
至于你说的 static完全存在 子类和父类重名的 static变量和static方法,这个必须在具体调用的时候指定到底是 调用的是子类的还是父类的,所以说这个是不安全的,估计 think in java说的安全就是  不存在二义性 
------解决思路----------------------
应该是说的保证对象安全发布的问题,涉及到Java内存模型和重排序。
------解决思路----------------------
他说的是  构造器。。。。

引用:
Quote: 引用:

final说明是 这个一个已经是终极的了,不可能在改变了, private说明只能这个类使用,
至于你说的 static完全存在 子类和父类重名的 static变量和static方法,这个必须在具体调用的时候指定到底是 调用的是子类的还是父类的,所以说这个是不安全的,估计 think in java说的安全就是  不存在二义性 

的确会存在子类和父类重名的static变量或static方法。但是static方法是和对象无关的,和类有关,所有think in java 书上说:
”static和final 方法同样不会动态绑定。“ 因此我觉得调用static方法时,不需要考虑是子类或父类的,在哪个类中调用,就是谁的static方法。 
按照书上”static和final 方法同样不会动态绑定。“这句话,我觉得static应该和final是一样对待的。 


个人感觉还是为了 避免二义性,虽然现在找不到证据在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的有关问题
------解决思路----------------------
假设有如下构造函数
public Test(){
...
object.a = 1;
object.b = 2;
function(this);
...
}
考虑多线程的情况,如果构造器中调用了一个public方法如上面的function,把正在构造的对象传递进去,由于重排序的原因,function(this);可能在object.b=2;之前执行,这时对象还没有完全构造。而且方法是公共的,我们无法确定方法之中会对对象进行什么操作,因此会存在风险。当然,至于作者是不是这个意思,楼主再看一下上下文,仔细推敲一下。