一个Java变量赋值的弱问题
以下这段语句是正确的语句:
public class ClassExample{
// 声明成员属性,可以是静态的或非静态的
int i;
static int j;
// 静态初始化语句块
static{
j=10;
System.out.println("In static initializer.");
}
//实例初始化语句块
{
i=10;
System.out.println("In instance initializer.");
}
// 构造方法
public ClassExample(){
System.out.println("In constructor.");
}
public static void main(String[] args){
new ClassExample();
}
}
但是,我如果把整个“实例初始化语句块”注释掉,这样对i赋值:
int i;
i =10; //但如果直接采取int i=10;的赋值形式也可以编译通过
static int j;
则显示这样的错误:
ClassExample.java:8: <identifier> expected
i=10;
^
ClassExample.java:8: cannot resolve symbol
symbol : class i
location: class ClassExample
i=10;
^
2 errors
怎么回事呢?呵呵
问题点数:20、回复次数:7Top
1 楼zealVampire(白鹤泉)回复于 2005-02-04 19:26:57 得分 0
我倒 你要么直接就这样
private int i =10;就好了的啊
要么就在方法里面赋值
怎么可以
private int i;
i = 10;
Top
2 楼addcplus(一打就倒)回复于 2005-02-04 19:53:00 得分 0
为什么不可以呢?不太理解呀,呵呵Top
3 楼xxzxzx(xxzxzx)回复于 2005-02-04 20:04:43 得分 0
java的规据就是多Top
4 楼sbgphl(十八哥)回复于 2005-02-04 22:03:17 得分 0
关注!Top
5 楼apollo333()回复于 2005-02-04 22:07:11 得分 14
兄弟的问题是个好问题啊,以前没注意。找了一下,建议去看《JAVA IN A NUTSHELL》第3章,3。2 CREATING AND INTIALIZING OBJECTS。就都明白了。
看你的名字应该是从C++转过来的吧。因为JAVA是纯面向对象语言,就是说所有的东西都是类,包括已经存在的API库和任何人要编的JAVA程序。在类里只能有2种东西存在。一个是变量,一个是方法。所以用任何一种都合理。
private int i =10;这个就是变量。合理。
如果写成这样
private int i;
i = 10;
很明显第2个不是方法。所以JAVA说出错。
但是JAVA语言里除了定义变量和方法外,还定义了构造函数。和方法类似。就是没有返回。
这个构造函数不管你定义不定义都存在。不定义,JAVA就自动生成,来默认。
当你写成这样的时候,
int i;
static int j;
// 静态初始化语句块
static{
j=10;
System.out.println("In static initializer.");
}
//实例初始化语句块
{
i=10;
System.out.println("In instance initializer.");
}
// 构造方法
public ClassExample(){
System.out.println("In constructor.");
}
JAVA实际做的是把
int i;
和这个块
{
i=10;
System.out.println("In instance initializer.");
}
放到构造函数里,就象
public ClassExample(){
int i;
i=10;
System.out.println("In instance initializer.");
System.out.println("In constructor.");
}
这样的来执行。
同样,对于静态的,JAVA也有个默认的构造函数在后台。静态的声明和静态块都放到那里。Top
6 楼zrtl(刚从软件园回来)回复于 2005-02-04 22:26:18 得分 6
在变量声明完成之后的赋值操作一定要在类方法里操作,int i=10;是直接在声明时赋初值当然可以的,而写在
{
i=10;
System.out.println("In instance initializer.");
}
里,因为这是一个匿名方法,已经有了方法的概念,所以也可以编译通过。Top
7 楼addcplus(一打就倒)回复于 2005-02-04 23:05:32 得分 0
apollo333和zrtl两位兄弟都分析的很透彻啊,呵呵
void ClassBodyDeclaration() :
{}
{
LOOKAHEAD( { isInitializer() } )
Initializer()
|
LOOKAHEAD( { isNestedClassDeclaration() } )
NestedClassDeclaration()
|
LOOKAHEAD( { isNestedInterfaceDeclaration() } )
NestedInterfaceDeclaration()
|
LOOKAHEAD( { isConstructorDeclaration() } )
ConstructorDeclaration()
|
LOOKAHEAD( { isMethodDeclaration() } )
MethodDeclaration()
|
FieldDeclaration()
}
其中
void VariableInitializer() :
{}
{
ArrayInitializer()
|
LOOKAHEAD(1, <BOOLEAN> | <BYTE> | <CHAR> | <DOUBLE> | <FALSE> | <FLOAT> | <INT> |
<LONG> | <NEW> | <NULL> | <SHORT> | <SUPER> | <THIS> | <TRUE> |
<VOID> | <INTEGER_LITERAL> | <FLOATING_POINT_LITERAL> |
<CHARACTER_LITERAL> | <STRING_LITERAL> | <IDENTIFIER> | <LPAREN> |
<BANG> | <TILDE> | <INCR> | <DECR> | <PLUS> | <MINUS>)
Expression()
}
Top




