在构造器内唯一能够安全调用的那些方法是基类中的final或者private方法,这些方法不能被覆盖,因此也就不会出现令人惊讶的问题。 附:关于这句话的背景 http://blog.csdn.net/yaerfeng/article/details/7294882 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 final说明是 这个一个已经是终极的了,不可能在改变了, private说明只能这个类使用,至于你说的 static完全存在 子类和父类重名的 static变量和static方法,这个必须在具体调用的时候指定到底是 调用的是子类的还是父类的,所以说这个是不安全的,估计 think in java说的安全就是 不存在二义性 应该是说的保证对象安全发布的问题,涉及到Java内存模型和重排序。 的确会存在子类和父类重名的static变量或static方法。但是static方法是和对象无关的,和类有关,所有think in java 书上说:”static和final 方法同样不会动态绑定。“ 因此我觉得调用static方法时,不需要考虑是子类或父类的,在哪个类中调用,就是谁的static方法。 按照书上”static和final 方法同样不会动态绑定。“这句话,我觉得static应该和final是一样对待的。 Java内存模型和重排序求详细点说 他说的是 构造器。的确会存在子类和父类重名的static变量或static方法。但是static方法是和对象无关的,和类有关,所有think in java 书上说:”static和final 方法同样不会动态绑定。“ 因此我觉得调用static方法时,不需要考虑是子类或父类的,在哪个类中调用,就是谁的static方法。 按照书上”static和final 方法同样不会动态绑定。“这句话,我觉得static应该和final是一样对待的。 个人感觉还是为了 避免二义性,虽然现在找不到证据 假设有如下构造函数public Test(){...object.a = 1;object.b = 2;function(this);...}考虑多线程的情况,如果构造器中调用了一个public方法如上面的function,把正在构造的对象传递进去,由于重排序的原因,function(this);可能在object.b=2;之前执行,这时对象还没有完全构造。而且方法是公共的,我们无法确定方法之中会对对象进行什么操作,因此会存在风险。当然,至于作者是不是这个意思,楼主再看一下上下文,仔细推敲一下。 获取当前时间 addBatch()出错! 求教构造器调用问题~ 怎么把JMenuBar加到JPanel上? 问一个弱智问题 jTree怎样添加类别? 怎样将JTable的Cell编辑方式设置为与Excel的一样? 如何用 Java 编写捕捉 adsl 上网时得到的的动态 IP 地址 ? FTP的问题,救命! JAVA的socket问题 java字符串分割问题 关于Java小程序的一个错误
至于你说的 static完全存在 子类和父类重名的 static变量和static方法,这个必须在具体调用的时候指定到底是 调用的是子类的还是父类的,所以说这个是不安全的,估计 think in java说的安全就是 不存在二义性
”static和final 方法同样不会动态绑定。“ 因此我觉得调用static方法时,不需要考虑是子类或父类的,在哪个类中调用,就是谁的static方法。
按照书上”static和final 方法同样不会动态绑定。“这句话,我觉得static应该和final是一样对待的。
求详细点说
”static和final 方法同样不会动态绑定。“ 因此我觉得调用static方法时,不需要考虑是子类或父类的,在哪个类中调用,就是谁的static方法。
按照书上”static和final 方法同样不会动态绑定。“这句话,我觉得static应该和final是一样对待的。 个人感觉还是为了 避免二义性,虽然现在找不到证据
public Test(){
...
object.a = 1;
object.b = 2;
function(this);
...
}
考虑多线程的情况,如果构造器中调用了一个public方法如上面的function,把正在构造的对象传递进去,由于重排序的原因,function(this);可能在object.b=2;之前执行,这时对象还没有完全构造。而且方法是公共的,我们无法确定方法之中会对对象进行什么操作,因此会存在风险。当然,至于作者是不是这个意思,楼主再看一下上下文,仔细推敲一下。