问题描述
- 问一个JAVA的基础问题,希望大神们帮忙解惑。
-
有一段如下的代码,有几个疑惑:
1、定义了一个final的test1和一个static里面的test1,为什么定义2个test1不会有问题?
2、为什么在一个类中直接写static{ },这个是什么原理?
3、还有什么类似static{ }这样的写法?是什么原理?public class MyOwenTest{
public static final String test1 = "a";
static{
String test1 = "a";
String test2 = "a";
String test3 = "a";
}
}
解决方案
- 作用域不同
- 类加载时会执行static{}
- 想不起来
解决方案二:
1、定义了一个final的test1和一个static里面的test1,为什么定义2个test1不会有问题?
2、为什么在一个类中直接写static{ },这个是什么原理?
3、还有什么类似static{ }这样的写法?是什么原理?
1 static{}表示类加载时候执行的一个静态代码段 在构造函数执行之前就运行(我记得是) 注意,是一个代码段 意味着不光是函数的定义 这里的 test1 和 外面的 test1
是两个两个域的问题(我是这么理解的)
2 1中已经说明了
3 有一个直接写 {} 用处差不多 只不过是普通的代码段(也就是没有静态代码段那么牛x) 执行顺序在静态代码段之后
其实这里的知识在 java编程思想4(Thinking In Java 4) 都有提到 而且很好 如果楼主看完了请无视下面所说
虽说看了很多 代码也编了 测试了 但是该忘还是忘
因为书这玩意只是理解 如果说做一个东西的话 不会的地方直接找书 或者上网找 在学也不迟 最重要的是基础
解决方案三:
static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
tatic代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次
static{
String test1 = "a";
String test2 = "a";
String test3 = "a";
}
上面你可以这么写,但是你取不到这三个变量的
还可以这么用
class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}