5.4静态变量和静态方法

在介绍静态变量和静态方法之前,首先需要介绍static关键字,因为由static修饰的变量和方法被称为静态变量和静态方法。

有时,在处理问题时会需要两个类在同一个内存区域共享一个数据。例如,在球类中使用圆周率PI这个值,可能除了本类需要这个值,在另外一个圆类中也需要使用。这时没有必要在两个类中同时创建PI,因为这样系统会将这两个不在同一个类中定义的静态值分配到不同的内存空间中。为了解决这个问题,可以将PI设置为静态的。

被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和"."运算符调用静态成员。语法如下:

类名.静态类成员

【例1】创建并调用静态属性和静态变量

创建StaticDemo类,在类中使用static关键字定义一个属性和一个方法,并在主方法中调用。

java 复制代码
public class StaticDemo{
    static double PI = 3.1415;    //在类中定义静态变量

    public static void method(){    //在类中定义静态方法
        System.out.println("这是静态方法");
    }

    public static void main(String[] args){
        System.out.println(StaticDemo.PI);    //调用静态变量
        StaticDemo.method();    //调用静态方法
    }
}

运行结果如下:

3.1415

这是静态方法
注意:

虽然静态成员也可以使用"对象.静态成员"的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态成员和非静态成员。

静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public、private和protected修饰符的约束。

【例2】统计顾客总人数

在Cust类中创建一个静态整数类型属性count,在构造方法中让count自增。

java 复制代码
public class Cust{    //顾客类
    static int count = 0;    //共享的属性:人数
    String name;    //名称属性

    public Cust(String name){
        this.name = name;    //记录名称
        count++;    //人数递增
    }

    public static void main(String[] args){
        Cust c1 = new Cust("tom");
        System.out.println("我是第"+Cust.count+"名顾客,我叫"+c1.name);
        Cust c2 = new Cust("张三");
        System.out.println("我是第"+Cust.count+"名顾客,我叫"+c2.name);
        Cust c3 = new Cust("狗蛋儿");
        System.out.println("我是第"+Cust.count+"名顾客,我叫"+c3.name);
    }
}

运行结果如下:

我是第1名顾客,我叫tom

我是第2名顾客,我叫张三

我是第3名顾客,我叫狗蛋儿

从这个结果可以看出,因为count是用static修饰的,对于所有顾客来说这是一个共享的属性,每创建一个顾客,count这个属性都会加1,所以最后count统计出来的就是顾客的总人数。

如果在执行类时,希望先执行类的初始化动作,可以使用static定义一个静态区域,这块区域被称为静态代码块。当类文件被执行时,会首先执行static块中的程序,并且只会执行一次。静态代码块的语法如下:

public class example{

static{

...... //可以在这里写初始化的代码

}

}

最后总结以下使用static关键字要注意的几点:

☑ 在静态方法中不可以使用this关键字。

☑ 在静态方法中不可以直接调用非静态方法。

☑ 局部变量不可以使用static关键字声明。

☑主方法必须用static声明。

☑ 只有内部类可以使用static关键字声明。

相关推荐
程序员清风12 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55113 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊18 小时前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing18 小时前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠1 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840821 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide1 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家1 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺1 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602731 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端