静态块问题

oliveyuganfei 2007-12-26 01:08:01
public class test{

static{
i=1;
}
static int i=0;
public static void main(String args[]){
System.out.println("i="+i);

}
}
编译成功不.输出多少.为什么.
public class test{
static int i=0;

static{
i=1;
}
public static void main(String args[]){
System.out.println("i="+i);

}
}
编译成功不.输出多少.为什么.
关于静态变量.静态块.不静态块.常量.构造方法有人能讲的清楚些吗
...全文
441 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
beautiful123086 2007-12-28
  • 打赏
  • 举报
回复
下面我做个总结.
1.静态块和静态方法是按顺序执行.不管类是否实例化都会执行,静态块内必需是静态变量,静态块和静态方法都且只执行一次
2.非静态块,非静态变量比静态块,静态变量后执行,非静态块是在类实例化时执行,且实例一次非静态块都会执行一次.
非静态块也是按顺序执行,非静态变量也是一样,在实例化时执行,他们优先级比构造方法高
3.构造方法最后执行.
fengfeng925 2007-12-27
  • 打赏
  • 举报
回复
类中可以包含静态代码块,它不存在任何方法体中,Java虚拟机加载类的时候会执行这些代码块,假如类中包含多个静态代码块的话,将按照他们出现的顺序执行这些代码块.

再举个例子:

public class Test {
static int i = 5;
static {
System.out.println("i=" + i++);
}
static {
System.out.println("i=" + i++);
}

public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
System.out.println("i=" + i);
}
}

输出结果
i=5
i=6
i=7

至于静态常量和静态变量,后者在类中的值是可以改变的,前者一旦定义了就不能够再被改变.静态变量可以在类中被直接访问,或者通过类名被访问.

我也刚学java,以上是我的理解,希望对你有所帮助,帮顶了!
海会圣贤 2007-12-27
  • 打赏
  • 举报
回复
1啊!!!!!!!!!
oliveyuganfei 2007-12-26
  • 打赏
  • 举报
回复
上面的怪问题.希望哪位说的清楚一些.
static{
i=1;
}
static int i=0;不会报错啊
但是
static{
i+=1;
}
static int i=0;就会报错啊.
oliveyuganfei 2007-12-26
  • 打赏
  • 举报
回复
下面我做个总结.
1.静态块和静态方法是按顺序执行.不管类是否实例化都会执行,静态块内必需是静态变量,静态块和静态方法都且只执行一次
2.非静态块,非静态变量比静态块,静态变量后执行,非静态块是在类实例化时执行,且实例一次非静态块都会执行一次.
非静态块也是按顺序执行,非静态变量也是一样,在实例化时执行,他们优先级比构造方法高
3.构造方法最后执行.
oliveyuganfei 2007-12-26
  • 打赏
  • 举报
回复
很怪啊.这样
static{
i=1;
}
static int i=0;不会报错啊
但是
static{
i+=1;
}
static int i=0;就会报错啊.操他奶奶啊.怎么开发JAVA垃圾语言的

胡矣 2007-12-26
  • 打赏
  • 举报
回复
弄清楚最基本东西会理解了
-----------------------------------------------
能指教一下吗 不要打太极好吗?
net_yuhai 2007-12-26
  • 打赏
  • 举报
回复
弄清楚最基本东西会理解了
胡矣 2007-12-26
  • 打赏
  • 举报
回复
执行顺序其实设置断点很容易看出来的
谁能给说说原理?
ecsoft 2007-12-26
  • 打赏
  • 举报
回复
可以进行多练习就好了!
胡矣 2007-12-26
  • 打赏
  • 举报
回复
public   class   test{    

static{
i=1;
}
static int i=0;
public static void main(String args[]){
System.out.println("i="+i);

}
}

为什么下面这段,i怎么可以直接被赋值?貌似还没有申请变量吧?
static{
i=1;
}
hopegood 2007-12-26
  • 打赏
  • 举报
回复
不好意思,刚才说错呢!

静态变量:是指一个类被装载时,被装载的变量,它对所有的类来说,只有一个,该变量是可以静态方法所访问的,以上的main方法就是访问这个静态变量
静态块:是指类第一次被装载时,对类的静态变量进行初始化的地方,

不静态块:是指一个对象被构造时,最先被初始化的实例成员的地方,这里指的是对象的实例变量。静态方法是无法访问的,以上的main方法是无法访问静态块的变量。

常量:是指值在任何时候都不会被改变,它也分为静态与非静态。

public class test{

static{
i=1;
}//静态块
static int i=0; //这也是给静态变量赋值,但这个优先,因为在这个情况下,是按顺序的。
public static void main(String args[]){
System.out.println("i="+i);

}
}
这个输出为0,
老紫竹 2007-12-26
  • 打赏
  • 举报
回复
分析一下代码
static {
a = 9;
}
静态块,位置最前,最先执行 此时 a=9;

下面2种情况
1
static int a;
此处只是声明,没有赋值,所以a仍然是9

2
static int a=0;
此处不仅声明,而且赋值,所以到这里,a是0啦

我个人理解,static 变量在编译时,可能就已经预留了地址空间,也就是类一但加载,就会分配空间给他们。

over
hopegood 2007-12-26
  • 打赏
  • 举报
回复
静态块:是指一个对象被构造时,最先被初始化的实例成员,这里指的是对象的实例变量。静态方法是无法访问的,以上的main方法是无法访问静态块的变量。
静态变量:是指一个类被装载时,被装载的变量,它对所有的类来说,只有一个,该变量是可以静态方法所访问的,以上的main方法就是访问这个静态变量。
oliveyuganfei 2007-12-26
  • 打赏
  • 举报
回复
寻找"牛人",我找到牛人了
  • 打赏
  • 举报
回复
第二个输出0是正常的,第一个输出9就比较妖,
YeLang2007 2007-12-26
  • 打赏
  • 举报
回复
第一个问是输出0

第二个是1

1.所有静态的(无论其是变量还是块)都按顺序执行.

2.所有的非静态的块都在静态的(无论其是变量还是块)后执行.

3.所有的块(无论是静态的还是非静态的)都在构造之前执行.

测试代码:(仅供参考)

public class TestStaticMode
{
public TestStaticMode()
{
System.out.println("in structure");
}
static int i = 0;

{
System.out.println("in first no static i=" + i);
}

static {
i = 1;
System.out.println("in static i=" + i);
}

{
System.out.println("in second no static i=" + i);
}
public static void main(String args[])
{
TestStaticMode testStaticMode = new TestStaticMode();
System.out.println("i=" + i);

}
}

输出为:
in static i=1
in first no static i=1
in second no static i=1
mytest
i=1
  • 打赏
  • 举报
回复
静态块和静态成员变量一样,无论生成多少个对象,它们总是在第一次被执行,
接下来就不会再执行了,静态成员变量在各对象间是数据共享的。把Test改成
如下,就可以看到效果了。

public class Test {
public static void main(String[] args) {
ABC abc = new ABC();
System.out.println("----------");
ABC cba = new ABC();
System.out.println("----------");
ABC acb = new ABC();
}
}
  • 打赏
  • 举报
回复
运行一下下面的程序,就会对这些的执行顺序了解了。

public class Test {
public static void main(String[] args) {
ABC abc = new ABC();
}
}

class ABC {
private String str1 = getString("非静态成员变量1");
private String str2 = getString("非静态成员变量2");
private static String stra = getString("静态成员变量a");
private static String strb = getString("静态成员变量b");
{
System.out.println("非静态块1");
}
{
System.out.println("非静态块2");
}
static {
System.out.println("静态块1");
}
static {
System.out.println("静态块2");
}
public ABC() {
System.out.println("构造方法");
}
private static String getString(String type) {
System.out.println(type);
return type;
}
}


PS:静态块和静态方法一下,当中不能直接引用非静态的成员变量。
oliveyuganfei 2007-12-26
  • 打赏
  • 举报
回复
好奇怪.class StaticSec
{
static {
a=9;

}
static int a;
public static void main(String[] args)
{
System.out.println(a);
}
}输出9
class StaticSec
{
static {
a=9;

}
static int a=0;
public static void main(String[] args)
{
System.out.println(a);
}
}输出0,晕
加载更多回复(2)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧