论坛首页 入门技术论坛

工作多年之后遇到这样的笔试题尽然不会做,纠结....

浏览 2312 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-25  
public interface T
{
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);
}
}
   发表时间:2012-07-25  
在 interface  里声明的变量 都是常量
0 请登录后投票
   发表时间: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变量,绝不要起重复的变量/常量名。还有楼主随手起的变量名也起得太烂了点....
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics