当前页面: 开发资料首页 → J2SE 专题 → java构造函数问题
java构造函数问题
摘要: java构造函数问题
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循环用打括号括起来,编译通过。执行正常。
请问:这是为什么?
for (int i = 0; i < 10; i++) {
Rock2 a = new Rock2(i);
}
这样就不会错了,因为你不加括号是不允许定义循环内的局部变量的。
其实你可以这样想,如果不加括号则表示循环内后续没有语句了,这个变量定义都是多余的,根本不可能使用到它
Good Question
to Top
ChDw(米) ( ) 信誉:155 Blog
那为什么使用 new Rock2();
这种方式,要是在C++中恐怕不行了。
不错,不错~~~~
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);
}
}
不加括号是不允许定义循环内的局部变量的
使用new Rock2();那么他的构造方法依然会执行的
所以要是System.out.println("Creating Rock Number " + i);
而不关心他的返回值的时候,就不用定义了Rock2 a
问题很明显 调用了局部变量 跨范围使用了
樓上很多人在瞎說,只有 ChDw(米) 跟 碧海夜心 是對的
to XXKKFF(讠古 钅)
他在討論的局部變量是指聲明Rock2實例這個行為,不是你說的i,你理解錯了吧
sunliwen780502(孙立文)
在JAVA中是允許這樣的,就像你可以只寫2+3;而沒人強迫你要寫int sum = 2+3;一樣,在這裏 new Rock2(i) return 的Rock2實例因為沒有賦給任何變量所以自動丟失
我怎么加了大括号和没加大括号运行时都出现下面的错误:
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)
编译是通过的.
Rock2 r;
for ( int i = 0; i < 10; i++)
r = new Rock2(i);
这个问题提的好啊 我都没注意过
學習!
支持ChDw(米) 的说法!循环体内如果只用一个语句定义一个局部变量,没有后续的使用它的语句,就必须加{ },否则编译器会认为定义没什么意义,所以报错!加了{ }表示编译器认为你可能还会有后续语句会使用到它,所以不报错!(这是本人的理解,不知是否准确)
c++就没这个麻烦事,最多一个unreferenced variable的警告
谢谢torainer()
学习
不要在盾环中定义对量,这样消耗内存挺大