关于static的学习

1 static的作用:

static可以用来修饰方法修饰类,一旦被static所修饰的方法或变量,不需要依赖对象进行访问,只要类被加载了,就可以通过类名去访问。

从JVM加载机制来讲:静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。

2静态变量和静态方法

static基本用法

1、static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来。

静态变量和非静态变量的区别:

静态变量只是在类初次加载时被实例化,而且只实例化一次,被所有对象共享,在内存中只有一个副本。

非静态变量是对象所拥有的,而且只是在创建对象时会被初始化,在内存中存在多个副本,各个副本之间互不影响。

2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来

另外记住,即使没有显示地声明为static,类的构造器实际上也是静态方法。

被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变、处处变。

例如常用的constant类都是用static来修饰

这里总结一下静态和非静态之间的引用:

1、静态方法能不能引用非静态资源?不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。

2、静态方法里面能不能引用静态资源?可以,因为都是类初始化的时候加载的,大家相互都认识。

3、非静态方法里面能不能引用静态资源?可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。

静态块

静态块也是static重要应用之一。它也是用于初始化一个类操作的时候做操作用的。静态块里的代码而且只执行一次,只是在类被初始化时候所执行。

eg1

public class A {
    private static int a = B();

    static {
        System.out.println("Enter A.static block");
    }

    public A(){
        System.out.println("11111");
    }
    public static void main(String[] args) {
        new A();
    }

    public static int B() {
        System.out.println("Enter A.B()");
        return 1;
    }
}

打印结果:

Enter A.B()
Enter A.static block
11111

public class A {
    private static int a = B();

    static {
        System.out.println("Enter A.static block");
    }

    public A(){
        System.out.println("11111");
    }
    public static void main(String[] args) {
        new A();
        new A();
    }

    public static int B() {
        System.out.println("Enter A.B()");
        return 1;
    }
}

打印结果

Enter A.B()
Enter A.static block
11111
11111
从上面打印的两个结果分析来看,静态资源的加载顺序是严格按照静态资源的定义顺序来加载的,而且只被初始化一次。

eg2

public class A
{
    static
    {
        c = 3;
        System.out.println(c);
    }
    
    private static int c;
}

这段代码的  System.out.println(c);是有错误的“Cannot reference a field before it is defined”。从这个例子得出第二个结论:静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问

eg3

public class A {
    
    static {
        
        System.out.println("A.static block");
    }
    
    public A (){
        
        System.out.println("A.constructor()");
    }
    
}

public class B extends A {

    static {
        System.out.println("B.static block");
    }

    public B() {
        System.out.println("B.constructor()");
    }

    public static void main(String[] args) {
        new B();
        new B();
    }
}

打印结果

A.static block
B.static block
A.constructor()
B.constructor()
A.constructor()
B.constructor()
静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值