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关键字声明。

相关推荐
FQNmxDG4S1 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人2 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang2 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje2 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv73 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫3 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287923 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本3 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab3 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang