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

相关推荐
枫叶丹43 小时前
【Qt开发】容器类控件(二)-> QTabWidget
开发语言·qt
ytgytg284 小时前
芋道源码:VUE3部署:避坑--验证码不现显示,管理后台无法访问后端接口等,完善中。。。
java·vue
乾坤瞬间4 小时前
【Java后端进行ai coding实践系列】如何使用ai coding实现计划任务增删改查
java·人工智能·python
昔我往昔4 小时前
@ApiModel注解升级成@Schema注解
java
草莓熊Lotso4 小时前
模板进阶:从非类型参数到分离编译,吃透 C++ 泛型编程的核心逻辑
linux·服务器·开发语言·c++·人工智能·笔记·后端
草莓熊Lotso4 小时前
《算法闯关指南:优选算法--前缀和》--25.【模板】前缀和,26.【模板】二维前缀和
开发语言·c++·算法
浔川python社4 小时前
C++ 实际应用系列(第六部分):并发系统的性能优化与工程实践(完)
开发语言·c++·性能优化
Dxy12393102164 小时前
python如何做声音识别
开发语言·python
superlls4 小时前
(场景题)Java 导出 Excel 的两种方式
java·开发语言·后端·excel