static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭

Posted Roninaxious

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭相关的知识,希望对你有一定的参考价值。

2021/9/4/18:37


1、一般情况下类的创建

一般情况下,只有当我们执行new来创建对象时,才能为数据分配存储空间;其中的方法或者属性才能被外界调用

2.一般情况下类创建产生的问题

有两种情况是上面无法解决的。第一种情况就是为某一特定域分配单一的存储空间(域也可以理解为类属性),不去考虑究竟要创建多少对象;第二种情况是希望某个方法不与类的任何对象联系在一起,也就是即使没有创建对象,也依旧可以调用这个方法。

2.1、第一种情况如何使用static解决

如上图所示,nation变量的值永远为china,创建一两个对象还可以,如果创建了上百个对象,那么是不是很浪费资源。所以我们可以使用静态关键字static进行标识该变量,就会变成如下

这就是使用static解决第一种情况(为特定域分配单一的存储空间),这静态区里的变量随着类的加载就存在了。在程序的整个运行过程中都存在,当程序结束时,由系统进行清除。(因此由static修饰的属性也可以成为全局变量)

2.2、第二种情况如何使用static解决

第二种情况我们都遇到过,比如工具类某某Utils,我们一般都是在其他类中直接类名.方法直接调用;

使用static修饰也要注意很多,不能过多的使用static修饰变量或者方法,因为static修饰的变量或方法是属于类层级的,虽然类的加载而分配存储空间,因此,你的static方法或者属性越多,在一开始就会分配固定的内存空间,那么大部分的内存空间分配给了static,剩下的内存空间就不多了,就会造成内存负担。

	public static void main(String[] args) {
       ..........
    }

static方法在不创建对象的情况下就可以通过类名调用,这对于main方法很重要,main方法是运行一个应用的入口点。

3.如何调用static修饰的属性或方法

1.类名.属性

class Test{
	static String num = 1;
}	
Test.num = 2;

2.引用.属性

Test test = new Test();
test.num = 2;

由于静态修饰的方法或属性是类层级的,随着类的加载而出现,所以通过类名.方法调用应该都会明白;那么通过引用调用静态变量该怎么理解呢?
这是因为static修饰的变量或方法是被类的所有对象共享的,也就是其中任何一个对象都可以调用进行修改。

4.静态变量、方法和非静态变量、方法之间的调用问题

1.无法在静态方法中调用非静态变量

这是因为静态方法是随着类的加载而加载,非静态变量是new该类对象时而加载;前者出现过早,根本无法加载到其中的非静态变量。

2.非静态方法可以调用静态变量

和第一个类似,静态变量首先出现,轮到加载非静态方法时当然可以得到

3.无法在静态方法中调用非静态方法,可以在静态方法中调用非静态方法

总之,只要牢牢记住静态和非静态的加载顺序就很容易理解了。

5、有关static相关的案例

class StaticTest {
	static int num = 10;
}
StaticTest test1 = new StaticTest();
StaticTest test2 = new StaticTest();
test1.num++;
System.out.println(test2.num);

结果:11

只要记住static修饰的变量被类的所有对象共享,那么这一类的题就会很容易就能解决!

6、静态代码块

首先静态代码块随着类的加载而执行,而且只运行一次;如果由多个静态代码块,会按照顺序来执行。

看下面一段代码是否在你的意料之中

public class StaticTest {
    
    static {
        System.out.println("静态代码块执行....");
        System.out.println(country);
    }
    
    private static String country = "china";
    
    public static void main(String[] args) {
        System.out.println(country);
    }
}

结果

当我该变顺序之后

public class StaticTest {
    private static String country = "china";

    static {
        System.out.println("静态代码块执行....");
        System.out.println(country);
    }

    public static void main(String[] args) {
        System.out.println(country);
    }
}

结果:

所以当在静态代码块中调用静态变量时,一定要将定义静态变量的位置放在静态代码块之前。

7、静态代码块的作用以及需要注意的细节

如果一些代码在项目启动时就要执行并且只需要执行一次,那么就可以放到静态代码块中。比如我们启动一个项目要加载相应的配置文件,那么我们就可以将其放到静态代码块中

需要注意的细节

1.静态代码块不能出现在任何方法当中

无论是静态方法还是非静态方法都是如此
对于非静态方法,这个很好理解,因为静态代码块是在类加载之后就能运行的;而非静态方法只能在new完对象之后,通过对象才能运行这个方法
对于静态方法,在类加载时,虽然静态方法也加载了,但是静态方法必须通过类名或者对象名才能访问。也就是说静态方法是被动运行的,静态代码块是主动运行的。

2、静态代码块不能访问普通变量

这个应该就不用说了。需要注意的是静态代码块中能够访问静态变量,但必须将静态变量的位置放在静态代码块前面。

2021/9/4/22:43

以上是关于static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭的主要内容,如果未能解决你的问题,请参考以下文章

static关键字有什么作用

Java面试题|static关键字的作用是什么?

C语言这两道题加了static跟没加的有什么区别?

C#中static关键字的作用

Spring AOP 一般用在啥场景中

static volatile a b=c;