浏览 2312 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-07-25
{ int i = 1; } public class TA { public int i = 0; public static void main(String[] args) { System.out.println(new TA().i); } } public class TTA extends TA implements T { public static void main(String[] args) { System.out.println(new TTA().i); } } /********/ public interface T1 { int i = 1; } public class TA1 implements T1 { public int i = 0; public static void main(String[] args) { System.out.println(new TA1().i); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-07-25
在 interface 里声明的变量 都是常量
|
|
返回顶楼 | |
发表时间:2012-08-14
测试了一下...果然自己基础太烂...说明下自己的测试结果,原理不是很懂... 1.TA中的main运行结果为0,毫无疑问,访问自身的 i 2.TTA中的main编译出错,提示The field is ambiguous...,应该是因为它不知道这个new TTA().i是要访问T中的static final i(接口中声明的量是自然static final的)还是要访问继承自TA中的i。 3.TA1中的main运行结果为0,它在有一个实现接口得来的static final i的情况下,仍直接访问了自身的i。 下面再说说几种变化情况的结果 4.在TTA中的main使用如下语句替代: System.out.println(TTA.i) 结果仍然是The field is ambiguous,说明即使只有一个static i访问的情况下,编译器仍不能确定你要访问哪一个i 5.TA1中的main使用如下语句: System.out.println(TA1.i) 结果报错,是Cannot make a static referrence to the non-static field B.i,显然,编译器坚持认为你是要访问TA1中的i,而不是T1中的static final i 6.在5的情况下,如果继续删除TA1中对i的声明 public int i=0 则运行结果为1,编译器找到了接口中的static i 总的来说,假设接口IA,父类A,子类AChild,变量名var,访问new AChild().var时: 1.如果A和IA中各有一个var,而子类中没有明文声明var,编译时会出现The field is ambiguous,即使在一个是static另一个不是的情况下,无论使用AChild.var还是new AChild().var访问也均会报错。(如上述情况1、4) 2.如果AChild也明文声明var,则一定直接访问AChild中的var。如果想访问IA中的var,只能使用IA.var的形式。如果使用Achild.var,会出现5所示的情况。 以上情况的原理是什么,还希望有高人进一步分析。 Btw,感觉这个问题像是运算符优先级问题——你不需要背住运算符的优先级,打括号就可以了。上述问题其实也没必要全弄清楚,总之接口、父类、子类、static变量,绝不要起重复的变量/常量名。还有楼主随手起的变量名也起得太烂了点.... |
|
返回顶楼 | |