在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的有关问题
在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的问题。
“在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的问题。“
这句话是think in java中的话。
我的疑问是static方法呢? 为什么说构造器中唯一能够安全调用的方法是final方法。static方法我觉得同样会安全。
------解决思路----------------------
final说明是 这个一个已经是终极的了,不可能在改变了, private说明只能这个类使用,
至于你说的 static完全存在 子类和父类重名的 static变量和static方法,这个必须在具体调用的时候指定到底是 调用的是子类的还是父类的,所以说这个是不安全的,估计 think in java说的安全就是 不存在二义性
------解决思路----------------------
应该是说的保证对象安全发布的问题,涉及到Java内存模型和重排序。
------解决思路----------------------
他说的是 构造器。。。。
个人感觉还是为了 避免二义性,虽然现在找不到证据
------解决思路----------------------
假设有如下构造函数
public Test(){
...
object.a = 1;
object.b = 2;
function(this);
...
}
考虑多线程的情况,如果构造器中调用了一个public方法如上面的function,把正在构造的对象传递进去,由于重排序的原因,function(this);可能在object.b=2;之前执行,这时对象还没有完全构造。而且方法是公共的,我们无法确定方法之中会对对象进行什么操作,因此会存在风险。当然,至于作者是不是这个意思,楼主再看一下上下文,仔细推敲一下。
“在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的问题。“
这句话是think in java中的话。
我的疑问是static方法呢? 为什么说构造器中唯一能够安全调用的方法是final方法。static方法我觉得同样会安全。
------解决思路----------------------
final说明是 这个一个已经是终极的了,不可能在改变了, private说明只能这个类使用,
至于你说的 static完全存在 子类和父类重名的 static变量和static方法,这个必须在具体调用的时候指定到底是 调用的是子类的还是父类的,所以说这个是不安全的,估计 think in java说的安全就是 不存在二义性
------解决思路----------------------
应该是说的保证对象安全发布的问题,涉及到Java内存模型和重排序。
------解决思路----------------------
他说的是 构造器。。。。
个人感觉还是为了 避免二义性,虽然现在找不到证据
------解决思路----------------------
假设有如下构造函数
public Test(){
...
object.a = 1;
object.b = 2;
function(this);
...
}
考虑多线程的情况,如果构造器中调用了一个public方法如上面的function,把正在构造的对象传递进去,由于重排序的原因,function(this);可能在object.b=2;之前执行,这时对象还没有完全构造。而且方法是公共的,我们无法确定方法之中会对对象进行什么操作,因此会存在风险。当然,至于作者是不是这个意思,楼主再看一下上下文,仔细推敲一下。