import java.util.*;class Rock2 {
  Rock2(int i) {
    System.out.println("Creating Rock Number " + i);
  }
}public class SimpleConstructor2 {
  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) 
      new Rock2(i);  
  }
}为什么以这种方式调用Rock2的构造函数。
而我的写法是 Rock2 a = new Rock2(i)
时却抱错了。把for循环用打括号括起来,编译通过。执行正常。
请问:这是为什么?

解决方案 »

  1.   

    for (int i = 0; i < 10; i++)  {
      Rock2 a = new Rock2(i); 
    }
    这样就不会错了,因为你不加括号是不允许定义循环内的局部变量的。
      

  2.   

    to Top  
     ChDw(米) ( ) 信誉:155    Blog  那为什么使用 new Rock2();
    这种方式,要是在C++中恐怕不行了。
      

  3.   

    to Top  
     ChDw(米) ( ) 信誉:155    Blog  
    把i定义为main的局部变量也不行啊!
    class Rock2 {
      Rock2(int i) {
        System.out.println("Creating Rock Number " + i);
      }
    }public class SimpleConstructor2 {
      public static void main(String[] args) {
        int i;
        for (i = 0; i < 10; i++) 
          Rock2 a = new Rock2(i);  
      }
    }
      

  4.   

    不加括号是不允许定义循环内的局部变量的使用new Rock2();那么他的构造方法依然会执行的
    所以要是System.out.println("Creating Rock Number " + i);
    而不关心他的返回值的时候,就不用定义了Rock2 a
      

  5.   

    樓上很多人在瞎說,只有 ChDw(米) 跟 碧海夜心 是對的to XXKKFF(讠古 钅) 
    他在討論的局部變量是指聲明Rock2實例這個行為,不是你說的i,你理解錯了吧sunliwen780502(孙立文)
    在JAVA中是允許這樣的,就像你可以只寫2+3;而沒人強迫你要寫int sum = 2+3;一樣,在這裏 new Rock2(i) return 的Rock2實例因為沒有賦給任何變量所以自動丟失
      

  6.   

    我怎么加了大括号和没加大括号运行时都出现下面的错误:
    Exception in thread "main" java.lang.UnsupportedClassVersionError: SimpleConstru
    ctor2 (Unsupported major.minor version 49.0)
            at java.lang.ClassLoader.defineClass0(Native Method)
            at java.lang.ClassLoader.defineClass(Unknown Source)
            at java.security.SecureClassLoader.defineClass(Unknown Source)
            at java.net.URLClassLoader.defineClass(Unknown Source)
            at java.net.URLClassLoader.access$1(Unknown Source)
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClassInternal(Unknown Source)
      

  7.   

    Rock2 r;
        for ( int i = 0; i < 10; i++)
          r = new Rock2(i);
      

  8.   

    支持ChDw(米) 的说法!循环体内如果只用一个语句定义一个局部变量,没有后续的使用它的语句,就必须加{ },否则编译器会认为定义没什么意义,所以报错!加了{ }表示编译器认为你可能还会有后续语句会使用到它,所以不报错!(这是本人的理解,不知是否准确)
      

  9.   

    c++就没这个麻烦事,最多一个unreferenced variable的警告谢谢torainer()