Java static 怎么用

早上刚到公司,同事小周就拿着电脑凑过来:“刚才改代码的时候,把一个工具方法加了static,结果调用时报错,到底static该怎么用啊?”其实不止他,很多刚接触Java的开发者,对static这个关键词总摸不着头脑——用的时候要么用错,要么不知道什么时候该用。今天就用几个生活化的例子,把这个知识点讲透。

先搞懂:static是啥?和“普通东西”有啥不一样?

咱们把Java里的变量、方法、类都比作家里的物品。普通的东西,比如你的专属水杯,是“你自己的”——只有你用,别人拿了也不是自己的,要是你把水杯摔碎了,就再也用不了了。

Java static 怎么用

而static的东西,就像家里的微波炉:不管是爸爸、妈妈还是你,都能共用这台微波炉,它属于“整个家”,不是某一个人的。就算你不用,家人也能用,它的存在和“你有没有用它”没关系。

放到Java里,普通的变量/方法属于“类的实例”——你得先new一个类的对象(相当于买了一个水杯),这个变量/方法才会被创建出来,而且每个对象的内容是独立的(你的水杯装温水,我的水杯装冷水,互不影响)。而static变量/方法属于“类本身”——不用创建对象,直接用“类名.变量名/方法名”就能调用,所有对象共享同一个static内容(就像这台微波炉,全家用的都是同一个加热功能)。

举个实际的小例子:咱们做一个“学生管理”的小功能,记录所有学生的总人数。如果用普通变量,每创建一个学生对象,就会多一个独立的“人数变量”,那创建100个学生,就有100个不同的数字,根本没法统计总人数。要是用static变量,这个“总人数”就属于学生这个类,每创建一个学生,static变量就加1,所有学生对象看到的都是同一个总人数,统计起来特别方便。

最常用的2种static用法:别乱碰,用对才高效

很多新手容易把static用得太乱,其实日常开发里,static基本就两种用法,用好这俩就够了。

第一种:用在“工具方法”上。比如写一个字符串转小写、计算两个数的和的方法,这些方法不需要用到对象的任何专属数据,只是做公共的功能。比如咱们做一个“数字工具类”,里面的add(int a, int b)方法,你不用创建工具类的对象,直接写NumberUtils.add(1,2)就能调用,省得每次用都要new一个工具类,多写好几行代码。

第二种:用在“全局共享的变量”上。比如刚才说的学生总人数,还有一些配置类的参数,比如项目里的服务器地址、版本号,这些数据所有地方都要用到,而且不会变,用static存起来,任何地方都能直接拿,不用到处传参数。

这里要提醒一句:绝对别用static存用户的个性化数据。比如你做一个登录功能,要是把当前登录用户名存在static变量里,那A用户登录后,这个变量就变成A的名字,B用户登录就会覆盖掉,最后所有用户都看到A的名字,这就是典型的用错了。

避坑小提醒:static不是万能的,别踩这些雷

用static的时候,有两个新手最容易踩的坑。

第一个坑:static方法里不能用this关键字。因为this代表“当前对象”,而static是属于类的,和对象没关系,要是你在static方法里写this.name = name,编译器会直接报错——它不知道this指的是哪个对象。

第二个坑:static变量的初始化要注意线程安全。如果多个地方同时修改static变量,比如两个用户同时修改同一个全局配置,就可能出现数据混乱。这时候可以用同步代码块处理,或者干脆不用static,改成对象的变量,每个用户自己改自己的,就不会出问题。

其实说白了,static的核心逻辑就是“要不要共用”:需要多个对象共享的内容,就用static;只属于单个对象的内容,就别碰static。多试几次用在工具方法上,用在全局配置上,很快就能摸出感觉,不会再用错了。

上一篇 TypeScript 如何让函数自动推导返回类型