问一个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";
}
}

  1. 作用域不同
  2. 类加载时会执行static{}
  3. 想不起来

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;
    }
}

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) 都有提到 而且很好 如果楼主看完了请无视下面所说

虽说看了很多 代码也编了 测试了 但是该忘还是忘
因为书这玩意只是理解 如果说做一个东西的话 不会的地方直接找书 或者上网找 在学也不迟 最重要的是基础