美文网首页
static关键字

static关键字

作者: liuzhifeng | 来源:发表于2017-10-14 19:01 被阅读0次

    Static关键字概述

    static(静态)关键字可以用于修饰变量、方法和代码块。我认为static关键字的主要用途是:方便程序在不创建对象的情况下调用相应的变量或者方法。被static修饰的变量或者方法可以简单地通过应用类名来进行调用,无需创建相应的对象。

    注意,Java语法规定,static不允许修饰局部变量

    1、static变量

    static变量即静态变量,被所有对象所共享,在内存中只有一个副本,当且仅当类被加载时初始化一次。
    举个例子:

            class StaticTest{
                static int i = 47;
            }
            
            StaticTest st1 = new StaticTest();
            StaticTest st2 = new StaticTest();
            System.out.println(st1.i  + " " + st2.i)
    
            StaticTest.i++; // 不用新建对象,直接调用static变量
            System.out.println(st1.i  + " " + st2.i)        
    

    在这里,StaticTest内存在一个静态变量i,在StaticTest类被加载时,i会初始化为47。新建两个StaticTest变量st1和st2,输出st1和st2的i的值,都为47。经过StaticTest.i++后,再输出st1和st2的i的值,都变成了48。即静态变量被这两个对象共享,且只有一个副本。

    如果一个类既有static变量,又有非static变量。那么在初始化时,先进行static变量的初始化,再进行普通变量的初始化,最后执行该类的构造函数。具体例子请查看“初始化和清除”一章。

    2、static方法

    static方法意味着“一个特定的方法没有this,我们不可以从一个static方法内部发出对非static方法的调用”,因为非static的变量和方法都需要通过实际具体的对象进行调用,而static方法没有this,不依附于任何对象
    即:非static的方法可以调用static的方法,但是static方法不能调用非static的方法

    因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。
    最常见的static方法即为main方法(public static void main)。由于程序在执行main方法之前没有任何对象,只能通过类名来调用,因此main方法必须是static的。

    3、static代码块

    static方法块只会在类初次被加载时,按顺序执行一次。巧妙利用static方法块,可以在一定程度上减少内存的使用,优化程序性能。
    我们来看一个例子:

    public class StaticTest {
        static Date a;
        static Date b;
        static{
            a = new Date(2008);
            b = new Date(2017);
        }
    
        boolean compare1(Date birthDate){
            if(birthDate.compareTo(a) >= 0 &&  birthDate.compareTo(b) < 0)
                return true;
            return false;
        }
    
        boolean compare2(Date birthDate){
            Date low = new Date(2008);
            Date high = new Date(2010);
            if(birthDate.compareTo(a) >= 0 &&  birthDate.compareTo(b) < 0)
                return true;
            return false;
        }
    }
    

    我们希望实现输入出生年月日,判断是否在2008--2017年内出生。
    按照compare2方法,每次输入一个人的出生年月,都需要新建两个Date对象,分别代表下界2008和上界2017,然后再进行比较。
    如果我们先在StaticTest类中定义两个static对象,同时通过static代码块在类初次被加载时对他们进行初始化为下界和上界。这样在输入数据进行比较compare1时,就不需要每次都新创建两个Date对象,优化了程序的性能

    因此,我们可以将一些只需要初始化一次的初始化操作都放在static代码块中进行。

    具体的一些代码和面试题,可以参考:Java中的static关键字解析

    相关文章

      网友评论

          本文标题:static关键字

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