黑马程序员技术交流社区

标题: 程序运行结果疑问 [打印本页]

作者: ㄗ灬Night|K    时间: 2013-10-19 14:02
标题: 程序运行结果疑问
为什么输出的结果是White而不是Black?


  1. public class TestA {

  2.         public static void main(String[] args) {
  3.                 System.out.println(X.Y.Z);
  4.         }
  5. }

  6. class X{
  7.         static class Y{
  8.                 static String Z = "Black";
  9.         }
  10.         static C Y = new C();
  11. }

  12. class C{
  13.         String Z = "While";
  14. }
复制代码

作者: 周学彬    时间: 2013-10-19 14:19
我去,楼主的代码玩的真是太混乱了,很难理清啊
但是要回答楼主的疑问还是可以的
你定义了一个静态内部类Y,然后试图用类X去调用这个类。类怎么可以调用类呢
所以,你的X调用的Y是在类X中定义的Y对象。Y对象是类C的一个实例,所以X.Y是一个C的对象,然后调用Z当然得出的结果就是While了
如果你在eclipse里面写程序就可以清楚地看出来,你这里的Y到底是对象还是类了
作者: wangyafeng1990    时间: 2013-10-19 14:39
如果你没有static C Y = new C();这条语句的时候,还程序会输出Black,而当你加上这条语句的时候,程序执行到这条语句会将C的引用赋给Y,即Y和C指向同一个,这时候X.Y.Z就是While;最后想告诉你你英语要补一补。white怎么写成了while
作者: 斗胆潇洒    时间: 2013-10-19 14:48
本帖最后由 斗胆潇洒 于 2013-10-19 14:54 编辑

这题真有趣,你可以先查查 静态内部类和非静态内部类的区别,
通过你这题我也学到了点知识啊{:soso_e181:}
静态内部类,也属于嵌套类,说白了,就是占着外部内地方的一个类,
虽说嵌套,其实算是平行的两个普通类了,你可以这样在Eclipse中main方法中
先写 X+点,你会发现提示中有 一个是包名下的Y(使用时也算顶级类了),还存在一个成员Y
X也是包下的,那个Y类也是,这也就是说静态内部类当平行的普通类用了,
那么也许X在两个Y中还是优先使用自己的成员C类对象Y的,没有的话,才会调用静态内部类Y

无标题.jpg (52.19 KB, 下载次数: 16)

无标题.jpg

作者: 上篮高手    时间: 2013-10-19 15:10
  1. public class Jiujiu {

  2.         public static void main(String[] args) {
  3.                 System.out.println(X.Y.Z);
  4.         }
  5. }

  6. class X{
  7.        
  8.          static C Y = new C();
  9.         static class Y{
  10.                 static String Z = "Black";
  11.         }
  12.       
  13. }

  14. class C{
  15.         String MM = "While";
  16. }
复制代码
当你把class C 中的Z 改为MM 后变异会报错,提示没有Z这个字段,
所以x.y.z 在编译阶段就已经确定要访问的是哪个了。
但如果你把 static C Y = new C(); 注释掉就不会产生这样的疑惑了。
所以当产生二义性的时候,即使编译通过,也应该进行修改。
作者: ㄗ灬Night|K    时间: 2013-10-19 16:26
斗胆潇洒 发表于 2013-10-19 14:48
这题真有趣,你可以先查查 静态内部类和非静态内部类的区别,
通过你这题我也学到了点知识啊
...

:handshake




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2