静态代码块中的变量为什么不需要声明数据类型?

CodingUp 2018-09-16 04:51:00
如下例所示:先执行静态代码块,为什么a=2可以不声明类型?

public class Test

{

static {a=2;}

static int a =1;

static int b = 3;

static{ b=4;}

public static void main(String[] args)

{

System.out.println(a);

System.out.println(b);

}

}

程序运行结果为:

1

4
...全文
1170 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DaiYuMeng 2018-09-17
  • 打赏
  • 举报
回复
引用 6 楼 qq_20118831 的回复:
[quote=引用 4 楼 DaiYuMeng 的回复:]
基于这个问题:
请问一下,为什么静态属性在静态代码块前加载,a=1没有被重新赋值为a=2呢?


和先后顺序有关,静态属性加载时候声明了类型,但是他的值和代码执行先后顺序有关。[/quote]
谢谢~我后来想想也觉得是这样
隐语者 2018-09-17
  • 打赏
  • 举报
回复
你可以去了解以下全局变量和局部变量的区别,静态代码块和全局变量创建时即‘显式’初始初始化两者的先后执行顺序!
EvanJim 2018-09-17
  • 打赏
  • 举报
回复
一楼正解,无论代码顺序,都是静态属性会按声明赋予初始值,int 为0。再根据代码顺序执行。如果类型不同,static代码块里的同名变量会被当做新的变量。代码块里的变量作用范围为本代码块{}范围。望采纳
	static
{
double a = 2;
}

static int a = 1;

static int b = 3;

static
{
double b = 4;
}

public static void main(String[] args)
{

System.out.println(a);

System.out.println(b);

}


结果:
1
3
冲上云霄 、 2018-09-17
  • 打赏
  • 举报
回复
引用 4 楼 DaiYuMeng 的回复:
基于这个问题:
请问一下,为什么静态属性在静态代码块前加载,a=1没有被重新赋值为a=2呢?


和先后顺序有关,静态属性加载时候声明了类型,但是他的值和代码执行先后顺序有关。
nayi_224 2018-09-17
  • 打赏
  • 举报
回复
写了个测试
public class Test54{

static class A{
static{
System.out.println(-1);
System.out.println(a);
}
A(){
System.out.println(111);
}
int b(){return -50;}
}

static{System.out.println("start");}

static {
System.out.println(222);
//System.out.println(b); 报错
a = 2;
}
static int a = new Test54.A().b();
static int b = 3;

final static int c = cc();

static int cc(){
System.out.println(c);
System.out.println(444);
return 4;
}

static {
System.out.println(333);
b = 4;
}

// static int d = e; 报错
// static int e = 5;
static int e = 5;
static int d = e;

static{System.out.println("end");}

public static void main(String[] args){
System.out.println(a);
System.out.println(b);
}

}

输出
start
222
-1
2
111
0
444
333
end
-50
4


从结果上看,加载的顺序应该是 方法-->属性-->块与属性的赋值按顺序进行。静态内部类不参与到类的加载中去。

从下面的例子看
		static int c = cc();

static int cc(){
System.out.println(dd());
return 4;
}

static String dd(){
System.out.println(c);
return "dd";
}

static int d = e;
static int e = 5;

方法的加载不需要先后顺序。但是属性加载会报Cannot reference a field before it is defined,应该是有序的。
DaiYuMeng 2018-09-17
  • 打赏
  • 举报
回复
基于这个问题:
请问一下,为什么静态属性在静态代码块前加载,a=1没有被重新赋值为a=2呢?
洪三思 2018-09-16
  • 打赏
  • 举报
回复
一楼正解,无论代码顺序,都是静态属性先加载,再是静态代码块加载
oyljerry 2018-09-16
  • 打赏
  • 举报
回复
a的定义再更前完成了
Surrin1999 2018-09-16
  • 打赏
  • 举报
回复
因为静态属性是先于静态代码块加载的 就这么简单

62,614

社区成员

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

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