static

作者: 寂静的春天1988 | 来源:发表于2020-05-07 23:25 被阅读0次

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会接着执行。后面的打印就不用说了!

相关文章

网友评论

      本文标题:static

      本文链接:https://www.haomeiwen.com/subject/rlmaghtx.html