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关键字深度解析来袭的主要内容,如果未能解决你的问题,请参考以下文章