java变量之static

本文深入探讨Java中final与static修饰符的使用与特性,包括它们如何影响属性、方法和类的行为,以及不当使用可能导致的问题,如重复item在popupwindow中的出现。适合Java初学者及需要复习相关概念的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做一个popupwindow的时候,设置标题列表,添加item内容,size为2,这里new了两个frament,却发现每次弹窗出来都有4个item,回去找原因,发现自己把这个列表用final static修饰了,这样子会导致这个类的所有对象用的属性都是同一个。刚好复习下:

final:

  • final可以修饰属性,方法,类,局部变量(方法中的变量)

  • inal修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。

  • final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。

  • final修饰的属性表明是一个常数(创建后不能被修改)。

  • final修饰的方法表示该方法在子类中不能被重写;

  • final修饰的类表示该类不能被继承。

对于基本类型数据,final会将值变为一个常数(创建后不能被修改);但是对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象。而且不能再将句柄指向另一个对象。但是,对象的本身是可以修改的。这一限制也适用于数组,数组也属于对象,数组本身也是可以修改的。方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值)。

static:

  • static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类)
  • static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变。
  • static修饰的属性所有对象都只有一个值。
  • static修饰的属性强调它们只有一个。
  • static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等
  • static和“this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。
  • static不可以修饰局部变量。
### Java Static 变量的使用及其特性 静态变量(`static variable`),也被称为类变量,在整个程序运行期间只存在一份副本,无论创建多少对象实例。这类变量属于类本身而非特定的对象实例[^1]。 #### 定义方式 通过在声明变量前加上 `static` 关键字来定义静态变量: ```java public class Example { public static int count = 0; } ``` 上述代码中的 `count` 即为静态变量,它不属于任何单独的对象而是归属于 `Example` 类。 #### 访问方式 可以直接通过类名访问静态变量,无需创建该类的具体实例: ```java System.out.println(Example.count); ``` 也可以经由对象实例访问,不过这种做法不被推荐因为容易引起混淆: ```java Example exampleInstance = new Example(); System.out.println(exampleInstance.count); ``` #### 特性说明 - **共享性质**:所有对象共用同一个静态变量;当某个对象修改了这个值,则其他对象看到的变化是一致的。 - **内存分配时机**:随着首次加载对应的 .class 文件到 JVM 后即完成初始化并分配空间,早于任意对象构建之前发生。 - **生命周期**:贯穿应用程序始终存活直至卸载相应的 ClassLoader 或者终止虚拟机进程为止[^2]。 #### 使用场景举例 假设有一个计数器用于记录某类型已产生的总数量,此时就可以利用静态变量实现这一功能而不必依赖额外的数据结构存储信息。 ```java public class Counter { private static int totalInstancesCreated = 0; public Counter(){ ++totalInstancesCreated; } public static int getTotalCount(){ return totalInstancesCreated; } } // 测试部分 Counter c1=new Counter(); Counter c2=new Counter(); System.out.println("Total Count:"+Counter.getTotalCount()); // 输出 Total Count:2 ``` 此案例展示了如何运用静态变量追踪同一类别下不同实体的数量变化情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值