A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ㄗ灬Night|K 中级黑马   /  2013-10-19 14:02  /  1288 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么输出的结果是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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

5 个回复

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

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

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

无标题.jpg

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

回复 使用道具 举报 1 0
  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(); 注释掉就不会产生这样的疑惑了。
所以当产生二义性的时候,即使编译通过,也应该进行修改。

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

回复 使用道具 举报
斗胆潇洒 发表于 2013-10-19 14:48
这题真有趣,你可以先查查 静态内部类和非静态内部类的区别,
通过你这题我也学到了点知识啊
...

:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马