static的特点:
1、可以修饰成员变量和成员方法。
2、被修饰的成员变量或者方法,与类同在。可以通过类名点调用(未被修饰的,与对象同在,一定要被new出来后才能被调用)
3、static修饰的变量,所有线程共享一份,在一个线程中被修改,那么所有线程都会被改变。
(这样也就带来了线程安全问题,所以一般static修饰的数据不能再修改了。)
static的注意事项:
1、static方法中是没有this关键字的(这个也好理解,this表示的是当前new出的对象,而static是与类同在的,自然也不会存在this关键字。)
2、静态方法只能访问静态方法和静态成员变量
静态代码块执行顺序
class Test1 {
static {
System.out.println("Test1 static");
}
{
System.out.println("Test1");
}
public Test1() {
System.out.println("Test1 构造方法");
}
}
public class Test {
static {
System.out.println("Test static");
}
public static void main(String[] args) throws Exception {
System.out.println("start........");
new Test1();
new Test1();
}
}
以上代码打印:
Test static
start........
Test1 static
Test1
Test1 构造方法
Test1
Test1 构造方法
解析:main方法首先加载Test类,先会执行Test类中静态代码块的代码,然后打印start,然后创建Test1(),先执行静态代码块中的代码,然后执行代码块中的方法,最后执行构造方法中的代码。由创建了一次Test1(),顺序和上面一样,代码static中的代码只会被执行一次!
class Fu {
static {
System.out.println("Fu static");
}
{
System.out.println("Fu");
}
public Fu() {
System.out.println("Fu 构造方法");
}
}
class Zi extends Fu{
static {
System.out.println("Zi static");
}
{
System.out.println("Zi");
}
public Zi() {
System.out.println("Zi 构造方法");
}
}
public class Test {
public static void main(String[] args) throws Exception {
new Zi();
}
}
以上打印:
Fu static
Zi static
Fu
Fu 构造方法
Zi
Zi 构造方法
我的错误理解打印:
Fu static
Fu
Fu 构造方法
Zi static
Zi
Zi 构造方法
解析:这里犯了一个错,认为Zi static会在后面打印。但是因为静态代码块的方法随着类的加载而加载(跟创建对象无关),所以Fu static执行完Zi static会接着执行。后面的打印就不用说了!









网友评论