-
java解惑 谜题53 的不解5
我是java初学者。
在看到谜题53时有一些疑问,描述如下:
有一库类:public class Thing { public Thing(int i){ .... } } public class MyThing extends Thing { private final int arg; public MyThing(){ super(arg = Math.random()); //为什么编译不过去。书上说线程安全,没太理解。请指教.. 从网上搜了 下,构造方 //法不是线程安全的啊。 } } public class MyThing extends Thing { private final int arg; public MyThing(){ this(Math.random()); } private MyThing(int i){ super(i); arg = i; } }
第二个子类可以,为什么它可以呢?谢谢指教。2009年12月26日 12:32
5个答案 按时间排序 按投票排序
-
全都没讲到点子上。报错这和final没有任何关系。举个列子
public int i=1;
public MyThing(){
super(i);
}
上面这段代码也会编译不通过的:Cannot refer to an instance field arg while explicitly invoking a constructor(在明确调用一个构造器的时候不能引用类的一个实例域)
原因很简单,我们假如可以通过编译器。我问一个问题,调用构造器是干什么的?
大家都知道,创建一个对象并初始化对象中的数据域。红色字体很重要,在上面的列子中new MyThing()的作用就是为了初始化这个对象的数据域i,试问在没有通过构造器初始化之前,i的值是不确定的。我们怎么能使用一个不确定的i值来初始化对象。
打个比方:我们去银行取5元钱,但是必须首先交5块钱手续费(也就是首先明确初始化)。我能不能给银行的人说:你把5元先取给我,然后我再把这钱给你交手续费呢???
当然例子不是很恰当,但说的意思差不多。总之,必须要先明确初始化实例域,才能创建好对象,进而才能使用对象的数据域。在没有实例化之前就想使用他,就像没有取出5元钱就想先用这钱一样,不可能。
public int i=1;
public MyThing(int j){
super(j);
}
上面的代码就可以,为什么,因为编译器知道,你如果想构造这个对象,必须传过来一个确定的值来初始化。2009年12月29日 10:53
-
楼上说得不太对,final变量是可以被赋值的,但必须保证只被赋一次。像这种成员变量,就可以在构造函数中赋值。
问题是java对语法结构是很严格的,a = b这样的语句被认为不是值(既不是左值也不是右值,不能再用),不能foo(a = b),也不能c = (a = b)或者(a = b) = c。所以编译不过去的。
考虑到super必须在第一句话,只能写成你下面的那种形式了。
实际上,在构造函数里调用外面的方法,像random,是不太合适的。比较好的办法是写个静态方法createMyThing来产生一个对象。2009年12月29日 08:20
-
super(arg = Math.random());
就算arg不是final的,这种调用方法在java里可以吗? 如果可以话,这种情况传的参数值是什么?2009年12月26日 22:27
-
private final int arg;
arg = Math.random();
为什么编译不过去?当然编译不过去。arg是final的变量,给一个final类型的变量赋值当然会报错了。
你在Eclipse等ide自己写个例子,它会提示你不能被赋值。2009年12月26日 16:04
相关推荐
java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题 java 高级谜题 ......
java解惑java解惑java解惑java解惑java解惑java解惑
我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...
Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑
java解惑(java谜题)中文版的. 值得一看的JAVA资料. Java puzzlers
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑
Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf
JAVA面试谜题解惑.pdf
Java解惑中文版 Java解惑 java健壮程序
JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf
与java相关的的学习,适合初学者,可以看看
Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑
《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版
JAVA解惑,你面包括一些java经典的问题。
在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、...
Java谜题 Java谜题1——表达式谜题 谜题1:奇数性 谜题2:找零时刻 谜题3:长整除 谜题4:初级问题 谜题5:十六进制的趣事 谜题6:多重转型 谜题7:互换内容 谜题8:Dos Equis 谜题9:半斤 谜题10:八两 ...
《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...