在Java语言中,static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
到这里有人可能会想问:是不是我在任何地方都可以调用这个变量或者这个方法呢?
显然,我们的主角具有很大的独立性——被static修饰的成员变量和成员方法独立于该类的任何对象。
也就是说,它不依赖类特定的实例,被类的所有实例共享。
那怎么实现共享呢?
其实,只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。
(注:如果大家对类的加载顺序不了解,可以参考.......)
因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
至于谁可以调用static方法或者static变量,这个就需要问一问它的修饰符啦~~
1.用public修饰static。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的
所有实例共享同一个static变量。也就是说,至始至终,就只有这一个static变量。
2.用private修饰static
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静
态成员方法中使用),但是要记住一点,它不能在其他类中通过类名来直接引用,这一点很重要。
且实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
结合上下文来说,我们可以这样理解:static变量(方法)只有一个,它在类初次加载的时候就被创建了,所有人共享一个,不管你有没有权限它都在那里,你有权限就访问,没权限就不能访问,就这么简单。
好啦,上面简单地介绍了一下static的特性。
下面来了解一下static在Java语言中的使用。
static在Java语言中的使用主要有四种:(变量、方法、代码块、内部类)
1、static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。static成员变量的初始化顺序按照定义的顺序进行初始化。
而对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、静态方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员需要通过对象实例访问,非静态方法中都隐含this句柄。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
另外记住,即使没有显示地声明为static,类的构造器实际上也是静态方法。
注:因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、static代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。 因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
这个部分比较重要,我在这里只是简单地介绍一下,在另一篇文章中我有对static代码块进行详细介绍。
文章链接:静态块的加载顺序<<<一定要看哟<<<
4. 静态内部类(Inner Class)
这个也很重要,我会单开一篇文章。
总结:其实,看完这篇文章,大家可以发现,static的作用完全可以用一句话来概括,即方便在没有创建对象的情况下来进行调用(方法/变量)。
好啦,关于static的一些知识就算总结完啦,当然,static绝对不止是这些知识点,如果大家有什么别的发现,或者发现了我文中表述不对的地方,欢迎大家一起留言评论,我们一起学习呀~~
Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!