我接下来把int i=20给注释掉了
结果编译器说找不到变量i
那我在static块里定义的i变量到哪里去了?不明白
结果编译器说找不到变量i
那我在static块里定义的i变量到哪里去了?不明白
解决方案 »
- mysql+hibernate一个超级简单的例子出现问提?帮忙解决一下!
- 对 Characer类的digit(char ch, int radix)方法的研究
- 怎样实现点击一个JButton弹出一个网页链接?
- 如何写任意有颜色的点写到一个jpg文件??
- String 转化为 Integer java.lang.NumberFormatException: For input string: "22"
- Java里两个二位小数相加,会得到小数点后很多位,怎么解决呢?
- wwm1978请进,接分
- JAVA中为什么没有提供同时继承多个类的机制
- 救命啊,我搞了一天了,还不行,socket提示IOException: invalid stream header
- 关于socket编程的问题,请高手指教!
- 请问某个数据库(如oracle)的jdbc驱动程序是不是在所有平台下通用?
- jdk1.3要怎么设置啊
{
int i = 20; static {
int i = 10;
System.out.println(i) ;
} ; public static void main(String[] args) {
Q8 a = new Q8();
System.out.println(a.i);
}
} 结果先输出10,然后输出20,有点类似于构造函数.
{
int i = 20; void x() {
int i = 10;
System.out.println(i) ;
} ; public static void main(String[] args) {
Q8 a = new Q8();
System.out.println(a.i);
a.x() ;
}
} 结果先输出20,然后输出10,类的变量在它的函数中可以重复定义
{
int i = 20; public void x() {
int i = 10;
System.out.println(i) ;
} ; public static void main(String[] args) {
Q8 a = new Q8();
a.x() ;
System.out.println(a.i);
}
} 结果先输出10,然后输出20,函数定义的变量在没有改变类定义的变量
{
int i = 10;
}
是java的静态初始化器,当类Q8;加载入内存时,系统自动调用静态初始化器
把类静态域初始化。
static
{
int i = 10;
} 与Q8的成员i已经不在同一范围之内,所以编译的时候不会报错。Q8类装载的时候先初始化i为10,如果不建新一个Q8类实例,i为10;如果建新一个Q8类实例i变为20。
public class Q8
{
//int i = j;
static
{
int i = 10;
//int i=30;
}
public static void main(String[] args)
{ System.out.println(Q8.i);
}
}
编译出错"q8.java": Error #: 300 : variable i not found in class test.Q8 at line 14, column 24
如果按你说的,i应该是Q8的静态成员变量,那为什么编译器会说找不到变量i呢?那个在static块里定义的i究竟放到哪里去了呢?
只能这样了。
static int i = 20;
static
{
i = 10;
}
所以以上的现象没有什么奇怪的啊。
{
int i = 20;
static
{
int i = 10;
System.out.println(i);
} public static void main(String[] args)
{
Q8 a = new Q8();
System.out.println(a.i);
}
}等同于如下:public class Q8
{
int i = 20; public static void main(String[] args)
{
{
int i = 10;
System.out.println(i);
}
Q8 a = new Q8();
System.out.println(a.i);
}
}
也就是说static块与static main方法类似,如果没有main方法,也可以被执行,对吧,这个问题在核心技术I中有提到,static块中的语句会被执行。然后,你把static移到main方法中,因为他是块,也就是说这里的i是被定义在块里,所以当然不会有冲突了。
原理就是static块在实例被初始化时会先被执行。这一点楼上的弟兄们都提到了。
{
int i = 20;
/*
public static void main(String[] args)
{
Q8 a = new Q8();
System.out.println(a.i);
}
*/
static {
Q8 a = new Q8();
System.out.println(a.i); int i = 10;
System.out.println(i);
}
}虽然会抛出一个违例,但是可以正常输出。
是不是对你有启发?
你的程序
public class Q8
{
//int i = j;
static
{
int i = 10;
//int i=30;
}
public static void main(String[] args)
{ System.out.println(Q8.i);
}
}
编译出错"q8.java": Error #: 300 : variable i not found in class test.Q8 at line 14, column 24
根本就没有对Q8进行实例话,java的编译器再强也只是给静态变量来一个列表吧?
没有实例话的类,根本不可能找到什么变量的吧?
我把程序改为了:public class Q8
{ static
{
int i = 10; }
public static void main(String[] args)
{
Q8 t=new Q8();
System.out.println(t.i);
}
}
他还说找不到,这是为什么?我已经声明了类的实例了阿?
sharetop(天生不笨) ( ) :谢谢你
我把你的最后一个例子运行了一下,是20,10,20
看来是先运行static block,在运行static main
但是还有一个问题不明白,就像上面的代码,如果我只在static block里面声明i,虽然把类实例化,但还是找不到i,必须在static block外定义才行
是不是static block内定义的变量不是该class的成员变量,所以访问不到?
我相信static块中的变量不应是这个类的成员变量,它的地位如同static main方法一样,但肯定会被先执行。