站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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()


学习


不要在盾环中定义对量,这样消耗内存挺大


↑返回目录
前一篇: 问个这样的问题:怎样自动根据条件转向不同的页面。
后一篇: 帮忙看看下面这点小代码?是不是因为jdk的版本造成的!(关于java.lang.Integer)