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

目录
  • 引言
  • 引言
    • 什么时候使用静态变量?
    • 小总结
    • 引用访问静态变量
    • 小总结
  • 总结

引言

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

初学stat

引言

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

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

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

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

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

什么时候使用静态变量?

先来看一个代码:

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类来访问就可以了;

代码如下:

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

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

引用访问静态变量

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

测试代码:

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;
    }
}

小总结

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

总结

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

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

(0)

相关推荐

  • 详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资源(静态变量与静态方法) 被static关键字修饰的变量和方法统一属于类的静态资源,是类实例之间共享的.被static关键字修饰的变量.方法属于类变量.类方法,可以通过[类名.变量名].[类名.方法名]直接引用,而不需要派生一个类实例出来. 静态资源分类存放的好处 JDK把不同的静态资源放在了不同的

  • 解析Java中的static关键字

    一.static关键字使用场景 static关键字主要有以下5个使用场景: 1.1.静态变量 把一个变量声明为静态变量通常基于以下三个目的: 作为共享变量使用 减少对象的创建 保留唯一副本 第一种比较容易理解,由于static变量在内存中只会存在一个副本,所以其可以作为共享变量使用,比如要定义一个全局配置.进行全局计数.如: public class CarConstants { // 全局配置,一般全局配置会和final一起配合使用, 作为共享变量 public static final in

  • 带你了解Java中Static关键字的用法

    目录 Java中Static关键字的一些用法详解 1. Static 修饰类属性,因为静态成员变量可以通过类名+属性名调用,非静态成员变量不能通过类名+属性名调用: 2. Static 修饰类方法,可以通过类名.静态方法名的方式调用静态方法,不可以用类名.静态方法名调用非静态方法: 3. 静态代码块,匿名代码块,构造函数.三者的调用顺序为(静态代码块(只调用1次) --> 匿名代码块 --> 构造函数). 总结 Java中Static关键字的一些用法详解 1. Static 修饰类属性,因为静

  • 详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说可以构成 静态内部类, 那别人认为你不错:如果你说了静态导包,那别人认为你很OK: 那我们就先在这几方面一一对static进行总结:然后说一些模糊的地方,以及一些面试中容易问道的地方: 1)static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方

  • Java基础之static的用法

    一.前言 在java中static可以用来修饰以下内容: 成员变量 静态变量,可以直接通过类名去访问 成员方法 静态方法,可以直接通过类名去访问 代码块 静态代码块,当java虚拟机加载类时,就会执行该代码块 二.static修饰成员变量 成员变量 静态变量,可以直接通过类名去访问 2.1 类的成员变量 类的成员变量包括 类变量(静态变量) 被static修饰的变量 在内存中只有一个拷贝 类内部,可以在任何方法内直接访问静态变量 其它类中,可以直接通过类名访问 实例变量 没有被static修饰的

  • Java中的static静态代码块的使用详解

    一.与静态方法的比较 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口.两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 二.静态方法注意事项 使用类的静态方法时,注意: a.在静态方法里只能直接调用同类中其他的静态成员(包括变量

  • C#中static静态变量的用法实例

    本文实例讲述了C#中static静态变量的用法.分享给大家供大家参考.具体如下: 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型   静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: ① .该变量在全局数据区分配内存. ② .初始化:如果不显式初始化,那么将被隐式初始化为0.   静态局部变量 定义:在局部

  • php中static 静态变量和普通变量的区别

    php中static 静态变量和普通变量的区别 在变量的前面加上static 就构成了静态变量(static 变量). static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误. static变

  • Java中的static的使用指南

    一.Java中的static使用之静态变量 1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象存在.静态成员可以使用类名直接访问,也可以使用对象名进行访问.使用 static 可以修饰变量.方法和代码块. 2.public 修饰符表示公开的.公有的,静态变量使用static修饰 3.静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员. public class HellWorld{ String

  • Java中的Static class详解及实例代码

     Java中的Static class详解 Java中的类可以是static吗?答案是可以.在Java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top level class).只有内部类可以为static. 静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同. (1)内部静态类不需

  • Java中的static关键字全面解析

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin05

  • Java中的static关键字深入理解

    在学习Java以来很长一段时间,我都不能理解为什么修饰一个方法的关键字各不相同,为什么有的方法可以直接调用,而有的方法需要用对象才能调用.毫不夸张的说,最近一次让我决定去整理清楚static关键字,是因为在写jdbc工具类时,其中通过静态代码块来实现加载驱动才让我对它有了新的认识. 通俗来讲,归为几点: 由static关键字修饰的方法或成员变量,不需依赖对象,就可直接访问.(通过 类名.方法名() 或 类名.属性 直接调用) static关键字不会影响到变量或方法的作用域 static关键字不允

  • Java中的static关键字你了解多少

    目录 一.static关键字的用途 1)static方法 2)static变量 3)static代码块 二.static关键字的误区 1.static关键字会改变类中成员的访问权限吗? 2.能通过this访问静态成员变量吗? 3.static能作用于局部变量么? 三.常见的笔试面试题 1.下面这段代码的输出结果是什么? 2.这段代码的输出结果是什么? 3.这段代码的输出结果是什么? 总结 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有th

随机推荐