Java static 关键字有那些作用

本文详细介绍了Java中static关键字的作用,包括静态变量、静态方法、静态代码块和静态内部类。static关键字用于创建类级别的变量和方法,使得它们可以在没有实例化对象的情况下通过类名直接访问。此外,还讨论了static与final结合使用的情况。

       static 属于 Java 中非常重要的一个关键字,也是使用非常多的一个关键字,另外在面试的过程中也经常被问到,今天我们单拿出来仔细分析,搞清楚 static 在编程中的的基本使用

static 关键字主要有两种作用:

第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关

第二,实现某个方法或属性与类而不是对象关联在一起,也是就说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性,具体而言,在 Java 语言中,static 主要有 4 种使用情况:成员变量成员方法代码块内部类

接下来我们就把这 4 中情况来一一介绍


一、static 成员变量


       虽然 Java 语言中没有全局的概念,但可以通过 static 关键字来达到全局的效果,Java 类提供了两种类型的变量:用 static 关键字修饰的静态变量和不用 static 关键字修饰的实例变量,静态变量属于类,在内存中只有一个赋值(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了,对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”


         实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个赋值,只能用“对象.实例变量”的方式来引用,一下是静态变量和实例变量的使用示例:

/**
 * static 成员变量测试
 */

public class Test {

    //这个是静态的成员变量
    public static int staticInt = 0;

    //这个是非静态成员变量
    public int noStaticInt = 0;


    public static void main(String[] args) {
        //实例化Test
        Test t = new Test();

        System.out.print("t.staticInt =" + t.staticInt);
        System.out.print("Test.staticInt =" + Test.staticInt);
        System.out.print("t.noStaticInt =" + t.noStaticInt);

        System.out.print("对静态变量和实例变量分别加1");

        t.staticInt++;
        t.noStaticInt++;

        Test t1 = new Test();

        System.out.print("t1.staticInt =" + t1.staticInt);
        System.out.print("Test.staticInt =" + Test.staticInt);
        System.out.print("t1.noStaticInt =" + t1.noStaticInt);
    }

}

运行结果为:

t.staticInt = 0

Test.staticInt = 0

t.noStaticInt = 0

对静态变量和实例变量分别加1

t1.staticInt = 1

Test.staticInt = 1

t1.noStaticInt = 0

从上例可以看出,静态变量只有一个,被类拥有,所有静态对象都共享这个静态变量,而实例对象是与具体对象相关的,这里需要注意的是,与 C++ 语言不同的是,在 Java 语言中,不能再方法体中定义 static 变量


二、static 成员方法


       与变量类似,Java 类同时也提供了 static 方法与非 static 方法,static 方法是类的方法,不需要创建对象就可以调用,而非 static 方法是对象方法,只有对象被创建出来后才可以被调用


       static 方法中不能使用 this 和 super 关键字,不能调用非 static 方法,只能访问所属类的静态成员变量和成员方法,因为当 static 方法被调用时,这个类的对象可能还没有被创建,即使已经被创建了,也无法确定调用那个对象的方法,同理,static 方法也不能访问非 static 类型的变量


       static 很重要的一个用途就是实现单例模式,单例模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为 private,外界无法创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样目的的只能把创建对象的方法声明为 static ,程序示例如下:

如果对构造方法和单例模式还不是太清楚,可以先阅读:

Java 什么是构造函数

深度剖析单例模式

/**
 * 单例模式示例(懒汉式)
 */

public class SingletonTest {

    //定义私有构造方法
    private SingletonTest() {

    }

    //定义一个SingletonTest类型的静态instance变量
    private static SingletonTest instance;

    // 静态方法返回该类的实例
    public static SingletonTest getInstance() {

        if (instance == null) {
            synchronized (SingletonTest.class) {
                if (instance == null) {
                    instance = new SingletonTest();
                }
            }
        }
        return instance;
    }
}
用 public 修饰的 static 变量和方法本质上都是全局的,若在 static 变量前用 private 修饰,则表示这个变量可以在类的静态代码块或者类的其他静态成员方法中使用,但是不能其他类中通过类名来直接引用


三、static 代码块


         static 代码块(静态代码块)在类中是独立于成员变量和成员函数的代码块的,它不在任何一个方法体内,JVM 在加载类时会执行 static 代码块,如果有多个 static 代码块,JVM 将会按顺序来执行, static 代码块经常被用来初始化静态变量,需要注意的是,这些 static 代码块只会被执行一次,示例如下:

/**
 * static 静态代码块
 */

public class Test {

    private static int a;

    static {
        Test.a = 4;
        System.out.print(a);
        System.out.print("静态代码块被调用");
    }

    public static void main(String[] args) {

    }
}

打印结果为:

4

静态代码块被调用


四、static 内部类

static 内部类是指被声明为 static 的内部类,它可以不依赖于外部实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化,静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型),示例如下:

/**
 * static 静态内部类
 */

public class OutTest {

    static int n = 5;

    static class InTest {
        void accessAttrFromOutTest() {
            System.out.print("InTest:OutTest.n=" + n);
        }
    }

    public static void main(String[] args) {
        OutTest.InTest nest = new OutTest.InTest();
        nest.accessAttrFromOutTest();
    }
}

运行结果为:

InTest:OutTest.n=5

这里需要注意的是,只有内部类才能被定义为 static


接下来我们引申一下,思考几个问题 如下:


1)什么是实例变量?什么是局部变量?什么是类变量?什么是 final 变量?


实例变量:变量归对象所有(只有在实例化对象后才可以),每当实例化一个对象时,会创建一个副本并初始化,如果没有显示初始化,                   那么会初始化一个默认值,各个对象中的实例变量互不影响


局部变量:在方法中定义的变量,在使用前必须初始化


类变量:用 static 可修饰的属性、变量归类所有,只要类被加载,这个变量就可以被使用(类名、变量名),所有实例化的对象共享                 类变量


final 变量:表示这个变量为常量,不能被修改


2)static 与 final 结合使用是什么意思?

       在 Java 语言中,static 关键字 常与 final 关键字结合使用,用来修饰成员变量与成员方法,对于变量,若使用 static final 修饰,则表示一旦赋值,就不可修改,并且通过类名可以访问,对于方法,若使用 static final 修饰,则表示该方法不可被覆盖,并且可以通过类名直接访问




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值