java static学习

本文详细解析了Java中静态变量(static)的特点与作用,包括其生命周期、存储位置、调用方式及与实例变量的区别,帮助读者掌握静态变量的正确使用。

static的特点:

  • 1.static是一个修饰符,用于修饰成员;

    2.static修饰的成员被所有的对象所共享;

    3.static优先于对象存在,因为static的成员随着类的加载就已经存在了;

    4.static修饰的成员多了一种调用方式,就可以直接被类名所调用。(类名.静态成员)

    5.static修饰的数据是共享数据,对象中存储的是特有数据;

    6.类变量也称为静态变量,在类中以static关键字声明,但必须在方法、构造方法和语句块之外。

    7.无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。

    8.静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
    

9.静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。

10.静态变量在程序开始时创建,在程序结束时销毁。

11.与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。

12.-默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。

13.静态变量可以通过:ClassName.VariableName的方式访问。 -类变量被声明为public static final类型时,类变量名称必须使用大写字
母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。

成员变量和静态变量的区别:

1.两个变量的生命周期不同

成员变量随着对象的创建而存在,随着对象的被回收而释放;

静态变量随着类的加载而存在,随着类的消失而消失;

2.调用方式不同

成员变量只能被对象调用;

静态变量能被对象调用,还能被类名调用;

3.别名不同

成员变量也称为实例变量;

静态变量被称为类变量;

4.数据存储位置不同

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据;

静态变量数据存储在方法区的静态区,所以也叫对象的共享数据;

Javastatic关键字用于修饰的成员,如成员变量、成员方法以及代码块等,但不能修饰局部变量[^2]。其核心用法和原理如下: ### 核心用法 - **静态变量变量)**:静态变量的所有实例共享,在加载时就会被初始化,不依赖于的实例。可以使用名直接访问,无需创建对象。例如: ```java public class Employee { private static int count = 0; // 静态变量 private String name; public Employee(String name) { this.name = name; count++; } public static void showCount() { System.out.println("当前员工数:" + count); } } // 测试 public class Main { public static void main(String[] args) { Employee e1 = new Employee("张三"); Employee e2 = new Employee("李四"); Employee.showCount(); // 输出:当前员工数:2 } } ``` 在上述代码中,`count` 是静态变量,记录了 `Employee` 的实例数量,可通过名 `Employee` 直接调用 `showCount` 方法访问该变量 [^1]。 - **静态方法**:静态方法属于,而不属于的实例。同样可以使用名直接调用,不需要创建对象。静态方法只能访问静态成员变量和其他静态方法,不能访问实例变量和实例方法,因为实例成员依赖于对象的创建。例如: ```java public class MathUtils { public static int add(int a, int b) { return a + b; } } // 调用静态方法 int result = MathUtils.add(3, 5); ``` - **静态代码块**:静态代码块在加载时执行,且只执行一次,主要用于对静态变量进行初始化操作。例如: ```java public class StaticBlockExample { static { System.out.println("静态代码块执行"); } public static void main(String[] args) { System.out.println("主方法执行"); } } ``` 运行上述代码,会先输出“静态代码块执行”,再输出“主方法执行”。 - **静态内部**:静态内部是指被声明为静态的内部,它可以不依赖于外部的实例而被实例化。静态内部只能访问外部的静态成员。例如: ```java public class OuterClass { static int outerStaticVar = 10; static class StaticInnerClass { void display() { System.out.println("外部的静态变量: " + outerStaticVar); } } } // 创建静态内部的实例 OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); inner.display(); ``` - **静态导入**:静态导入可以在代码中直接使用的静态成员,而无需使用名。例如: ```java import static java.lang.Math.PI; import static java.lang.Math.sqrt; public class StaticImportExample { public static void main(String[] args) { double area = PI * 5 * 5; double result = sqrt(25); System.out.println("圆的面积: " + area); System.out.println("25的平方根: " + result); } } ``` ### 原理 深入理解static关键字需要把握其“级别共享”的本质特征。在JVM中,的静态成员存储在方法区,加载时静态成员就会被分配内存空间并完成初始化,与的实例无关。因此,静态成员被的所有实例共享。不过,滥用static关键字可能带来内存问题和并发风险。结合JVM内存模型的学习,开发者可以更安全高效地运用这一特性,在系统设计时做出更合理的架构决策 [^3]。 ### 应用场景 static关键字在工具中应用广泛。工具中的方法通常都是静态方法,每个方法以完成一个共用的功能为目的,供系统开发人员共同使用。使用工具的好处是调用方便,提高了代码复用率。由于实例方法需要创建对象调用,使用对象只是为了调用方法会浪费内存,因此工具中的方法一般不用实例方法。同时,由于工具里都是静态方法,直接用名即可访问,无需创建对象,建议将工具的构造器进行私有 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值