解释以下JAVA代码出现的现象

来源:百度知道 编辑:UC知道 时间:2024/05/24 11:05:51
烦请解释后提供资料来源,按知道能给出的最高分结分。
/*No Error*/
package cn.com.rwang.test;

public class NoStaticTest {
AClass a;
AClass b;
{
a=new AClass(1);
b=new AClass(2);
}

}

/* Error With the field b*/
package cn.com.rwang.test;

public class NoStaticTest {
AClass a;
AClass b;
a=new AClass(1);
b=new AClass(2);

}

上面的类是正确的java类,下面的有语法错误。
在Java中,类直接包含的内容可以有:属性(成员变量)、方法、构造器、内部类及块(块包含静态块和非静态块)。
上面的类包含两个属性及一个非静态块,语法正确。
下面的类包含两个属性,但a=new AClass(1)......不可以被类直接包含,它可以被包含在方法、构造器及块中。

public class NoStaticTest {
AClass a;
AClass b;
{
a=new AClass(1);
b=new AClass(2);
}

}
这个是正确的,对于非静态变量的初始化,java是支持这种语法的,并且特别是对于匿名内部内,如果你不是在定义的时候就给成员变量赋初值,那么匿名内部类由于不存在类名,所以不存在显式的构造器(从而无法在构造器中初始化成员变量了),导致这种为成员赋初值的方式是必须的.
这种语法的另一个作用在于,无论一个类中存在有多少个构造器来创建对象,在这个对象创建前都会执行{...}中的代码,因为{...}中的内容是在构造器执行前执行的.有时候这样做是很有用的,你不需要在每个构造器中都编写相同的代码.
如果成员变量是
static AClass a;
static AClass b;
则在{...}前一般需要加上static关键字即:static{...},这样可以保证在{}中只对static变量进行初始化,如果{}中存在非静态变量则会出编译期错误,如下
static AClass a;
AClass b;

static{
a=new AClass(1);
b=new AClass(2); //compile error,非静态
}
你下面的错误是java语法错误,在编译阶段都是无法通过的,更别提执行了.

我觉得首先你应该把AClass的类特点说明下,才能更好的分析。还有错误信息。

第二个出错大概就是JAVA中的规则吧- =