每日一题----------类变量
由问题引出解决方案
按照传统思想:
创建调用方法的主类
//创建一个计数器 来记录小孩的个数
int count = 0 ;
game child1 = new game("张三");
child1.Game();
count++;
game child2 = new game("李四");
child2.Game();
count++;
game child3 = new game("王五");
child3.Game();
count++;
System.out.println("总共" + count + "个小孩在玩耍");
创建一个实体化的类,并且创建方法,来表示小孩玩耍的信息
class game{
//给小孩带一个姓名属性
private String name;
//传入小孩的姓名
public game(String name) {
this.name = name;
}
//打印小孩玩耍的信息
public void Game(){
System.out.println(name + "正在玩耍、、、、");
}
改进,将count设置为类变量(静态变量)
public static int count = 0;
在调用的时候,就是可以任意一个对象调用,然后累加
child1.count++;
child2.count++;
child3.count++;
关于静态类的内存分析图-------------------------------------------------------------------------------------------
静态变量的内存分配
-
存储区域:静态变量存储在方法区(Method Area)中。方法区是JVM运行时数据区的一部分,主要用于存储已被虚拟机加载的类信息、常量、静态变量等。需要注意的是,从Java 7开始,运行时常量池被移到了堆(Heap)中;而在Java 8及之后版本,永久代(PermGen)被元空间(Metaspace)取代,方法区的概念实际上由元空间实现。
-
生命周期:静态变量的生命周期与类的生命周期相同,即从类加载到JVM卸载该类为止。一旦类被加载到JVM中,静态变量就会被初始化,并且在整个程序执行期间都存在,除非显式地将其值设为
null
或重新赋值。 -
初始化时机:静态变量在类第一次被加载时初始化,这通常发生在首次创建该类的对象或首次访问静态成员(包括静态方法和静态变量)的时候。静态变量只能通过类名来引用,不能通过类的实例引用。
-
共享性:因为静态变量不属于任何一个具体的对象实例,而是属于整个类,所以它们可以被该类的所有实例共享。对静态变量所做的任何改变都会影响到所有使用该变量的地方。
注意事项
1. 线程安全:如果多个线程同时访问和修改静态变量,则可能会出现并发问题。在这种情况下,需要考虑同步机制以确保线程安全。
2.垃圾回收:静态变量不会随着类实例的销毁而被回收。只有当类本身被卸载时,其对应的静态变量才会被清除。因此,在使用静态变量时应小心管理资源,避免内存泄漏。
总结:
创建一个静态变量字符串name的名字为张三
class A {
public static String name = "张三";
}
然后创建主类,去访问,可以用类名直接访问
//可以自己类名访问
A.name ;
//也可以用创建对象来访问
A p1 = new A();
p1.name;
要注意访问修饰符,如果是私有的private也要遵循访问权限,否则会报错。