java中static关键字的作用

static大体上有五种用法:
1.静态导入。2.静态变量。3.静态方法。4.静态代码块。5.静态内部类。

接下来我们看一下这些用法。
一:静态导入
    静态导入,就是把一个静态变量或者静态方法一次性导入,导入后可以直接使用该方法或者变量,而不再需要写对象名。
看代码:
public class OldImport {
    public static void main(String[] args) {
        double a = Math.cos(Math.PI / 2);
        double b = Math.pow(2.4,1.2);

        double r = Math.max(a,b);

        System.out.println(r);
    }
}

import static java.lang.Math.*;

public class StaticImport {
    public static void main(String[] args) {
        double a = cos(PI / 2);
        double b = pow(2.4,1.2);

        double r = max(a,b);

        System.out.println(r);
    }
}
上面这俩段代码就是把Math类静态导入了,这样就不用像第一段代码一样写那么多math了,又精简了代码,开森!
墙裂建议:静态导入时一定要导入具体的方法,因为一些类中的方法名是一样的,如果只是使用通配符*,会让别人头疼的,等你回头看自己的代码时,恐怕会说脏话的!!
二:静态变量(这块大家都熟悉了,我就不过多的啰嗦了)
java类提供了两种类型的变量:用static修饰的静态变量和不用static修饰的成员变量。

静态变量属于类,在内存中只有一个实例。当jtbl所在的类被加载的时候,就会为该静态变量分配内存空间,该变量就可以被使用。jtbl有两种被使用方式:【类名.变量名】和【对象.变量名】。

实例变量属于对象,只有对象被创建后,实例对象才会被分配空间,才能被使用。他在内存中存在多个实例,只能通过【对象.变量名】来使用。
用法:当你的某一个变量会经常被外部代码访问的时候,可以考虑设计为静态的。

三:静态方法
静态方法和非静态方法一样,都跟class 本身在一起存放在内存中,永远不会被回收,除非 JVM 退出,他们使用的区别的一个方面是非static方法需要实例调用,static方法直接用类名调用。
【实例】单例模式,它提供了一种创建对象的最佳方式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
public class Singleton {
    private static Singleton singleton;

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

    private Singleton() {

    }
}
四:静态代码块
我们其实在工作中一直用到的代码块,所谓代码块是指使用“{}”括起来的一段代码。其中静态代码块只执行一次,构造代码块在每次创建对象是都会执行。
根据位置不同,代码块可以分为四种:普通代码块、构造块、静态代码块、同步代码块。ref:Java中普通代码块,构造代码块,静态代码块区别及代码示例。
五:静态内部类
定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。

通常称为嵌套类,当内部类是static时,意味着:

   [1]要创建嵌套类的对象,并不需要其外围类的对象;

   [2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);

   嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。

   另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的 对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于 该类的对象,更不属于其他外部类的对象。

你可能感兴趣的:(java基础)