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

相关推荐
vx-程序开发3 分钟前
springboot在线装修管理系统-计算机毕业设计源码56278
java·c语言·spring boot·python·spring·django·php
大傻^7 分钟前
Spring AI Alibaba 可观测性实践:AI应用监控与链路追踪
java·人工智能·后端·spring·springaialibaba
Dxy12393102167 分钟前
js如何把字符串转数字
开发语言·前端·javascript
云烟成雨TD12 分钟前
Spring AI Alibaba 1.x 系列【1】阿里巴巴 AI 生态
java·人工智能·spring
诗人不写诗15 分钟前
spring是如何组织切面的
java·后端·spring
_饭团25 分钟前
字符串函数全解析:12 种核心函数的使用与底层模拟实现
c语言·开发语言·学习·考研·面试·蓝桥杯
Larry_Yanan25 分钟前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
2401_8318249632 分钟前
嵌入式C++驱动开发
开发语言·c++·算法
qingcyb38 分钟前
重复 id 对应的多个对象
开发语言·python
li星野1 小时前
[特殊字符] 模拟试卷一:C++核心与系统基础(90分钟)答案版
开发语言·c++·算法