黑马程序员技术交流社区

标题: 求解!!!! [打印本页]

作者: 胡宝林    时间: 2012-6-7 16:55
标题: 求解!!!!
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,但是程序却根本不能编译,哪里出错了,求解!!!!
作者: 刘克方    时间: 2012-6-7 17:00
本帖最后由 刘克方 于 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());
    }
}
作者: 孙峰    时间: 2012-6-7 17:06
在同一个java文件中吧?只能放一个public 类, 将“public class D {“中的  public 去掉。
然后for 循环加上大括号

作者: 黑马任雪刚    时间: 2012-6-7 17:15
本帖最后由 黑马任雪刚 于 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());
    }
}



作者: 胡宝林    时间: 2012-6-7 17:22
黑马任雪刚 发表于 2012-6-7 17:15
你的代码:public class D {
     private static long x = 0;
     public D() {

照你说的做了 还是不可以编译
作者: 黑马任雪刚    时间: 2012-6-7 17:32
hy19985125 发表于 2012-6-7 17:22
照你说的做了 还是不可以编译

奥,不好意思,丢了东西:把你第一个类class D的修饰符public 去掉就OK了!
作者: 黑马任雪刚    时间: 2012-6-7 17:33
hy19985125 发表于 2012-6-7 17:22
照你说的做了 还是不可以编译

我把我给你的答案改了,你再看看。
作者: 胡宝林    时间: 2012-6-7 17:51
我这两个类不是在用一个文件中,哥们,一个类在一个.java文件中,也就是D在D.java中,F在F.java中
作者: 孙峰    时间: 2012-6-7 20:02
hy19985125 发表于 2012-6-7 17:51
我这两个类不是在用一个文件中,哥们,一个类在一个.java文件中,也就是D在D.java中,F在F.java中 ...

因为都是public 类,如果两个在同一个包中的话,可以直接调用。但是你的D类中,构造函数改变成员变量,这写法太牛了,以后不建议啊。     现在就只是一个错误,没加大括号
作者: 葛奎    时间: 2012-6-7 20:49
  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. }
复制代码

作者: 陌花╮有意、    时间: 2012-6-8 16:25
程序存在两个问题
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());
}
}




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