服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java中的static--静态变量你了解吗

Java中的static--静态变量你了解吗

2021-12-21 13:03YXXXYX Java教程

Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问,.下面我们来详细了解一下吧

引言

static 是 java 语言中的关键字,意思是“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。

初学stat

引言

static 是 java 语言中的关键字,意思是“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。

初学static的最大的问题就是:static有什么用?什么时候用?这里先说一下static的作用:

static的作用就是用于区分成员变量、方法、内部类、初始化块这四种成员到底属于类本身还是属于实例

这篇文章先介绍静态变量,后面几种会再下面的篇章中分别介绍

静态变量是成员变量的一种,静态变量存储在方法区中,则它在类加载时就会进行初始化,所以静态变量访问的时候不需要创建实例(对象),直接可以通过类名来访问;

什么时候使用静态变量?

先来看一个代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class StaticTest01 {
    public static void main(String[] args) {
        Chinese c1 = new Chinese("张三", "333333333333", "中国");
        System.out.print("姓名:" + c1.name);
        System.out.print(" 身份证号:" + c1.idNum);
        System.out.println(" 国籍:" + c1.nation);
        Chinese c2 = new Chinese("李四", "444444444444", "中国");
        System.out.print("姓名:" + c2.name);
        System.out.print(" 身份证号:" + c2.idNum);
        System.out.println(" 国籍:" + c2.nation);
    }
}
class Chinese {
    // 姓名; 实例变量
    String name;
    //身份证号; 实例变量
    String idNum;
    //国籍; 实例变量
    String nation;
 
    //无参构造器
    public Chinese() {}
    //有参构造器
    public Chinese(String myName, String myIdNum, String myNation) {
        this.name = myName;
        this.idNum = myIdNum;
        this.nation = myNation;
    }
}

输出结果:

姓名:张三 身份证号:333333333333 国籍:中国
姓名:李四 身份证号:444444444444 国籍:中国

可以看出来,这个Chinese类抽象的是中国人,所以这里面”国籍“实例变量就可以声明为静态变量,让国籍固定为chinese;
访问时只需要用Chinese类来访问就可以了;

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class StaticTest02 {
    public static void main(String[] args) {
        Chinese c1 = new Chinese("张三", "333333333333");
        System.out.print("姓名:" + c1.name);
        System.out.print(" 身份证号:" + c1.idNum);
        // 静态变量不需要实例化,只需要用类来访问就可以了
        System.out.println(" 国籍:" + Chinese.nation);
        Chinese c2 = new Chinese("李四", "444444444444");
        System.out.print("姓名:" + c2.name);
        System.out.print(" 身份证号:" + c2.idNum);
        System.out.println(" 国籍:" + Chinese.nation);
    }
}
class Chinese {
    // 姓名; 实例变量
    String name;
    //身份证号; 实例变量
    String idNum;
    //国籍; 静态变量
    static String nation = "中国";
 
    //无参构造器
    public Chinese() {}
    //有参构造器
    public Chinese(String myName, String myIdNum) {
        this.name = myName;
        this.idNum = myIdNum;
    }
}

输出结果:

姓名:张三 身份证号:333333333333 国籍:中国
姓名:李四 身份证号:444444444444 国籍:中国

可以看到输出结果都是一样的,这时候应该会有一个疑问:既然输出结果都一样,那么用静态变量有什么用呢?
这就涉及到底层的内存了,简单说一下,实例变量都存放在堆中,每一个实例变量都会占有一定的内存空间,像”国籍“这个实例变量同样每声明一个对象就会多占用一块空间,而静态变量存放在方法区中,而且只需要声明一次,这个类就可以一直用;

所以,如果这个类的所有对象的属性值都是一样的,不建议定义为实例变量,会浪费内存空间;
建议定义为静态变量,在方法区中只保留一份,节省内存的开销;

小总结

对于静态变量,

对象级别的变量不需要static

类级别的变量需要static

对象级别:一个对象对应一份数据,各个对象都可以不同
类级别: 所有对象对应一份数据,各个对象都一样

引用访问静态变量

静态变量可以使用引用去访问,但实际上在执行过程中,引用所指向的对象并没有参与,如果是空引用访问实例变量,程序一定会发生空指针异常,但是如果用空引用访问静态变量,程序并没有发生空指针异常,所以通过引用访问静态变量实际上还是直接通过类去访问的

测试代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class StaticTest03 {
    public static void main(String[] args) {
        Chinese c = new Chinese("张三", "3333333333");
        System.out.print("姓名:" + c.name);
        System.out.print(" 身份证号:" + c.idNum);
        //这里使用引用调用了静态变量nation
        System.out.println(" 国籍:" + c.nation);
 
        //将引用c置空
        c = null;
        /*
        这两个实例变量当引用c置空后就它所指向的实例就无法从堆内存中找到了
        System.out.print("姓名:" + c.name);
        System.out.print(" 身份证号:" + c.idNum);
        */
 
        //而因为nation是静态变量,存放在方法区中,还是可以找到;
        System.out.println(" 国籍:" + c.nation);
    }
}
class Chinese {
    // 姓名; 实例变量
    String name;
    //身份证号; 实例变量
    String idNum;
    //国籍; 静态变量
    static String nation = "中国";
 
    // 无参构造器
    public Chinese() {}
    // 有参构造器
    public Chinese(String myName, String myIdNum) {
        this.name = myName;
        this.idNum = myIdNum;
    }
}

小总结

通过代码测试,可以知道通过引用也可以访问静态变量,但是知道就行,不要这样做,因为采用引用方式访问的时候,程序员会认为你访问的是实例变量,就会给程序员产生困惑;

总结

对于静态变量,我们需要掌握它的用法、特点,要记住,只要与实例有关系的,必须先创建对象,然后通过引用的方式去访问,如果空引用访问实例相关的成员,必然会出现空指针异常;所有静态相关的,直接使用类名去访问,虽然静态相关的成员也能使用引用去访问,但是不要去使用,养成良好的代码习惯很重要!

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/YXXXYX/article/details/120118796

延伸 · 阅读

精彩推荐
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12