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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-7 16:55  /  2168 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class D {
     private static long x = 0;
     public D() {
         x++;
     }
     public static long getX() {
         return x;
     }
}
public class F {
public static void main(String[] args) {
        for (int i = 0; i < 100; i++)
           D d = new D();
        System.out.println(D.getX());
    }
}
//循环创建100个D对象,那么D类的x会累加100次,打印x的值应该是100,但是程序却根本不能编译,哪里出错了,求解!!!!

10 个回复

倒序浏览
本帖最后由 刘克方 于 2012-6-7 17:14 编辑

public class D {                        //文件中只能有一个public 类,所以把此处 的public去掉
     private static long x = 0;
     public D() {
         x++;
     }
     public static long getX() {
         return x;
     }
}
public class F {
public static void main(String[] args) {
        for (int i = 0; i < 100; i++)           //这儿少{};你加上以后就可以了,
           D d = new D();
        System.out.println(D.getX());
    }
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在同一个java文件中吧?只能放一个public 类, 将“public class D {“中的  public 去掉。
然后for 循环加上大括号

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马任雪刚 于 2012-6-7 17:35 编辑

你的代码:public class D {
     private static long x = 0;
     public D() {
         x++;
     }
     public static long getX() {
         return x;
     }
}
public class F {
public static void main(String[] args) {
        for (int i = 0; i < 100; i++)
           D d = new D();//这儿出错了,当你在循环创建新对象时(这时是每创建一个引用就指向一个实体),所有的对象引用名都是:d,出现了对象名重复,所以会出现编译时的错误。
        System.out.println(D.getX());
    }
}
修改后的代码:class D {//把public去掉
     private static long x = 0;
     public D() {
         x++;
     }
     public static long getX() {
         return x;
     }
}
public class F {
public static void main(String[] args) {
        D d;//现在循环的外面建立对象的引用,这样一个引用是可以指向多个对象实体的,避免了上述的问题
        for (int i = 0; i < 100; i++)
         d = new D();

        System.out.println(D.getX());
    }
}


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黑马任雪刚 发表于 2012-6-7 17:15
你的代码:public class D {
     private static long x = 0;
     public D() {

照你说的做了 还是不可以编译
回复 使用道具 举报
hy19985125 发表于 2012-6-7 17:22
照你说的做了 还是不可以编译

奥,不好意思,丢了东西:把你第一个类class D的修饰符public 去掉就OK了!
回复 使用道具 举报
hy19985125 发表于 2012-6-7 17:22
照你说的做了 还是不可以编译

我把我给你的答案改了,你再看看。
回复 使用道具 举报
我这两个类不是在用一个文件中,哥们,一个类在一个.java文件中,也就是D在D.java中,F在F.java中
回复 使用道具 举报
孙峰 黑马帝 2012-6-7 20:02:19
9#
hy19985125 发表于 2012-6-7 17:51
我这两个类不是在用一个文件中,哥们,一个类在一个.java文件中,也就是D在D.java中,F在F.java中 ...

因为都是public 类,如果两个在同一个包中的话,可以直接调用。但是你的D类中,构造函数改变成员变量,这写法太牛了,以后不建议啊。     现在就只是一个错误,没加大括号
回复 使用道具 举报
  1. class D {//去掉public 代码
  2.      private static long x = 0;
  3.      public  D() {
  4.          x++;
  5.      }
  6.      public static long getX() {
  7.          return x;
  8.      }
  9. }
  10. public class F {
  11. public static void main(String[] args) {
  12.         
  13.         for (int i = 0; i < 100; i++)
  14.         {D d = new D()};//对于for循环,加{}的表示一个语句块,它里面的内容是一个整体
  15.                        //而不加{}的for循环,它只能执行一条语句.
  16.                                    //当编译器遇到D d时候,中间有空格,就会编译报错  因为正常语句不存在D d这样的写法.
  17.                                    //加上{}的话,它就会执行编译完整个语句块,直到遇到最后的分号
  18.        
  19.        
  20.         System.out.println(D.getX());
  21.     }
  22. }
复制代码
回复 使用道具 举报
程序存在两个问题
1.一个文件只能有一个类是public的
2.循环中定义的变量重复
可以这样修改:
public class F {
public static void main(String[] args) {
  D d = null;
  for (int i = 0; i < 100; i++)
   d = new D();
  System.out.println(D.getX());
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马