JAVA之静态

1 静态概述

  • 静态:static关键字,静态、静止的。静态变量不会随着对象的变化而变化。

  • 加载时机:

    • 随着类的加载而加载。

    • 静态变量随着类的加载进方法区,就直接在静态区给开辟了存储静态变量的内存空间。

  • 静态变量优先于对象而存在。

  • 静态变量被所有该类对象所共享。

  • 代码层面:可以使用类名直接调用,不需要使用对象名称。在不创建对象的前提下,仍然可以使用这个静态变量。

  • 强烈建议使用类名来访问。

2. 静态效果

  • 不使用静态:

    • 现象:如果某个类型的所有对象,都具有一个相同的属性值,比如2个对象的age都是23; 那么这个属性值就没有必要在所有对象中,都存储一份。

    • 缺点:浪费内存空间;维护难度大,一旦需要修改,就得修改所有的对象。

    • 示例:

      public class Demo {
          String username;
          String country;
      
          public static void main(String[] args) {
              Demo d1 = new Demo();
              d1.username = "张三";
              d1.country = "中国";
      
              Demo d2 = new Demo();
              d2.username = "李四";
              d2.country = "中国";
          }
      }

      使用静态:

    • 现象:如果某个类型的所有对象,都具有一个相同的属性值,那么就在这个属性的定义上,加一个static静态关键字。让该变量存储在方法区字节码的静态区中,避免了所有对象都存储相同数据的问题,节省了内存空间,将来维护容易(只需要修改一次)。

    • 示例:

    • class Animal {
          int age;
          // 添加静态属性
          static String type;
      }
      
      class Demo {
          public static void main(String[] args) {
              Animal animal = new Animal();
              System.out.println(animal.age);
              animal.type = "金渐层";
              System.out.println(animal.type);
              Animal animal1 = new Animal();
              System.out.println(animal1.type);
              Animal.type = "银渐层";
              System.out.println(animal1.type);
          }
      }

    • 注意事项:

      • 静态方法:在方法声明上,加上了static关键字的方法,就是静态方法。

      • 静态方法不能访问非静态的变量:静态方法本身可以在没有创建对象的时候调用;非静态的变量只有在对象创建之后才存在。如果静态方法可以访问非静态的变量,那么就相当于在对象创建之前,就访问了对象创建之后的数据。明显不合理。

      • 静态方法不能访问非静态的方法:静态方法可以在没有创建对象的时候调用;非静态的方法可以访问非静态的变量。如果静态方法可以访问非静态的方法,就相当于静态方法间接的访问了非静态的变量,和第2点矛盾。

      • 静态方法中不能存在this关键字:this关键字表示本类当前对象。静态方法可以在对象创建之前调用。如果静态方法可以访问 this关键字,相当于在创建对象之前,就使用了对象本身。矛盾。

      • 总结:静态资源不能访问非静态资源

    • 概念上,所属不同:

      • 非静态变量属于对象。

      • 静态变量属于类,类变量。

    • 内存空间不同,存储位置不同:

      • 非静态变量属于对象,所以存储在堆内存中。

      • 静态变量属于类,存储在方法区的静态区中。

    • 内存时间不同,生命周期不同:

      • 非静态变量属于对象,所以生命周期和对象相同,随着对象的创建而存在,随着对象的消失而消失。

      • 静态变量属于类,所以生命周期和类相同,随着类的加载。

    • 访问方式不同:

      • 非静态变量只能使用对象名访问。

      • 静态变量既可以使用对象访问,也可以通过类名访问(强烈建议使用类名访问):

        • 类名.静态变量名

        • 类名.静态方法名()

    • 3 静态变量和非静态变量的区别

    • 概念上,所属不同:

      • 非静态变量属于对象。

      • 静态变量属于类,类变量。

    • 内存空间不同,存储位置不同:

      • 非静态变量属于对象,所以存储在堆内存中。

      • 静态变量属于类,存储在方法区的静态区中。

    • 内存时间不同,生命周期不同:

      • 非静态变量属于对象,所以生命周期和对象相同,随着对象的创建而存在,随着对象的消失而消失。

      • 静态变量属于类,所以生命周期和类相同,随着类的加载。

    • 访问方式不同:

      • 非静态变量只能使用对象名访问。

      • 静态变量既可以使用对象访问,也可以通过类名访问(强烈建议使用类名访问):

        • 类名.静态变量名

        • 类名.静态方法名()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值