许多同学们在学习或者编写程序时,经常会看到java中的一个关键字:static,而且这也是面试官喜欢经常问的一个问题,说明这是十分重要的,那么static关键字到底有什么作用呢,我们到底怎么来使用它呢?下面就让我们一起来看一看。

static关键字主要有以下4种用法:

1.修饰成员变量

2.修饰成员方法

3.静态代码块

4.静态导包

PS:其实除了上面的4种用法,java中还有一种情况会用到static关键字,那就是静态内部类,不过这种情况并不常见,我们就不过多的介绍了,这里提一下,让大家了解有这么个东西就好了。

1.修饰成员变量

在java中,被static关键字修饰的成员变量也叫静态变量,普通的变量叫实例变量。静态变量是类所拥有的属性,能够通过类名.+成员变量的方式访问(修饰符权限足够的情况下),在内存是唯一存在的,被所有的实例对象所共享,在类第一次加载时初始化。实例变量是每个实例对象特有的,不能影响其他的实例对象。
大家一起来看一下: class Test { public static int count = 0; public int number = 0;
public Test(){ count++; number++; } } public class Test1{ public static void
main(String[] args) { System.out.println(Test.count);//输出0 Test test1 = new
Test(); Test test2 = new Test(); Test test3 = new Test();
System.out.println(test1.count);//输出3 System.out.println(test2.count);//输出3
System.out.println(test3.count);//输出3 System.out.println(test1.number);//输出1
System.out.println(test2.number);//输出1 System.out.println(test3.number);//输出1
System.out.println(Test.count);//输出3 } }

由于静态变量是类所拥有的,并且被此类的所以实例对象共享,所以我们每次创建一个新的Test对象时,改变的count都是同一个,但是number是实例变量,每次创建时都会创建一个新的,每个对象影响的是自己的成员变量,不能影响其他的实例对象中的成员变量。

2.修饰成员方法

被static关键字修饰的方法又叫静态方法。静态方法同样是属于类的方法,不依赖具体的实例对象,可以通过类名.+方法名的方式访问(修饰符权限足够的情况下)。而实例方法必须依赖具体的实例对象才能访问。由于静态变量和静态方法是属于类的,而实例对象是属于这个类的一个具体实例,所以实例方法可以访问静态变量和静态方法,但是反过来,由于,实例变量和实例方法由于依赖于具体的实例,而静态方法不依赖具体的实例,所以在静态方法中调用实例变量和实例方法时会报错。如:当通过类名.+方法名这种方式去调用静态方法时,这时候没有具体的实例,实例变量和实例方法也就无法被调用,所以就会编译错误。
下面看看具体的例子: class Test { public static int count = 0; public int number = 0;
public Test(){} public static void print(){ System.out.println("这是静态方法,count =
" + count); //调用number会报错 //System.out.println("这是静态方法,number = " + number);
//调用print1会报错 //print1(); } public void print1(){
System.out.println("这是实例方法,count = " + count);
System.out.println("这是实例方法,number = " + number); } } public class Test1{ public
static void main(String[] args) { Test.print(); Test test = new Test();
test.print(); test.print1(); } }


明白了这些,我们再来看一看main方法。为什么main方法有个static修符?当我们的程序开始的时候,这个时候还没有任何类的实例被创建出来,所以在java虚拟机加载完我们的程序后,只能调用静态方法,这也就是为什么main方法是static的原因。

3.静态代码块

静态代码块即用static{.....}包含的代码,可以在类的任何地方使用(方法体内除外)。静态代码块和静态方法类似,不能访问实例变量和实例方法,可以调用静态变量和静态方法。只有当类第一次加载的时候才会执行,会如果有多个静态代码块,会按照顺序执行。静态代码块会优先于构造方法执行,因为,static会在类加载时执行,而构造方法在创建实例时执行。
看个例子: class Test { public Test(){ System.out.println("构造方法"); } static{
print(); System.out.println("静态代码块"); } public static void print(){
System.out.println("静态方法"); } } public class Test1{ public static void
main(String[] args) { Test test = new Test(); } }

由于static代码块只会在类初次加载时会被执行一次,我们常常可以利用这个特性来对程序进行优化,比如我们需要在类初始化的时候从外部读取一些图片,文件等,我们不必要每次创建一个实例都去从外部读取,可以放在静态代码块中去执行,这样可以大大优化性能。所以,static代码块中通常用来执行那些只需要执行一次的初始化操作。

4.静态导包
通常我们调用一个类的静态方法时,都是通过类名.+方法名的方式去调用,而通过静态导包的方式后,我们则可以直接调用了。
下面看看例子: package study; public class Test { public static void print(){
System.out.println("Hello World!"); } } package study; import static
study.Test.*; public class Test1 { public static void main(String[] args) {
print(); } }
这样通过静态导入后,我们就可以直接调用方法了。 注意:1.静态导包后,只能使用导入类里面的静态方法,不能通过这种方式调用实例方法。  
2.调用的方法不能和当前类已有的方法冲突,即不能同名(只要名字相同都会报错)。

static关键字是java中非常重要的一个知识点,希望大家能好好掌握。希望本文能够对大家有帮助。

技术
©2019-2020 Toolsou All rights reserved,
过拟合和欠拟合的形象解释2021 美赛时间安排表Springboot之JPA常用查询方法中国月球车“月兔二号”在月球发现一块奇怪岩石PS制作登录界面C语言程序设计课程设计 之《学生成绩管理系统》消息质量平台系列文章|全链路排查篇年薪20万属于什么水平?答案让人扎心!王者荣耀背景故事整合Jsp+Ajax+Servlet+Mysql实现增删改查(一)