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

相关推荐
消失的旧时光-194315 分钟前
第十四课:Redis 在后端到底扮演什么角色?——缓存模型全景图
java·redis·缓存
BD_Marathon16 分钟前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon20 分钟前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
Coder_Boy_22 分钟前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
css趣多多24 分钟前
add组件增删改的表单处理
java·服务器·前端
雨中飘荡的记忆26 分钟前
Spring Batch实战
java·spring
Java后端的Ai之路33 分钟前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
devmoon35 分钟前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
Evand J37 分钟前
TDOA(到达时间差)的GDOP和CRLB计算的MATLAB例程,论文复现,附参考文献。GDOP:几何精度因子&CRLB:克拉美罗下界
开发语言·matlab·tdoa·crlb·gdop
野犬寒鸦38 分钟前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习