1 static 概述
static 表示静态,是 Java 中的一个修饰符,可以修饰成员方法,成员变量
静态和类有关(随着类的加载而加载) 非静态和对象有关
2 static 分类
2.1 静态变量
被 static 修饰的成员变量,叫做静态变量
特点:
- 被该类所有对象共享,即共享同一个值
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象存在
调用方式:
- 类名调用(推荐)
- 对象名调用
2.2 静态方法
被 static 修饰的成员方法,叫做静态方法
特点:
- 多用在测试类和工具类中
- Javabean 类中很少会用
调用方式:
- 类名调用(推荐)
- 对象名调用
2 static 内存图
静态变量是随着类的加载而加载的,优先于对象出现的
静态变量在内存中会共享
3 static 注意事项
- 静态方法只能访问静态变量和静态方法
- 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
- 静态方法中是没有 this 关键字
总结:
- 静态方法中,只能访问静态。
- 非静态方法可以访问所有。
- 静态方法中没有 this 关键字
普通的成员方法,是有隐含的 this
3.1 为什么 非静态有 this ,静态没有 this
3.2 从内存角度
3.3 总结 :
非静态的普通成员变量、成员方法,他们调用,都需要通过对象去调用
而静态由于共享,是没有具体的对象的,那么他就不能调用普通的变量、方法
4 重新认识 main
- public: 被JVM调用,访问权限足够大
- static: 被JVM调用,不用创建对象,直接类名访问。因为main方法是静态的,所以测试类中其他方法也需要是静态的。
- void : 被JVM调用,不需要给JVM返回值
- main: 一个通用的名称,虽然不是关键字,但是被JIVM识别
- String[] args: 以前用于接收键盘录入数据的,现在没用
5 工具类
- Javabean类: 用来描述一类事物的类。比如,Student,Teacher,Dog,Cat等
- 测试类: 用来检查其他类是否书写正确,带有 main 方法的类,是程序的入口
- 工具类: 帮助我们做一些事情的,但是不描述任何事物的类
5.1 要求
- 类名见名知意
- 私有化构造方法 ----> 因为私有化构造方法,就不能创建此类的对象,而创建工具类的对象也是没有意义的
- 方法定义为静态
5.2 例子
定义一个对数组进行操作的工具类
public class ArrUtil{
privateArrUtil(){}
publicstaticintgetMax(...){..}
publicstaticintgetMin(..){..}
publicstaticintgetsum(..){..}
public:staticintgetAvg(..){...}
}
5.3 练习 定义数组工具类
请按照如下要求编写一个数组的工具类:ArrayUtil
- 提供一个工具类方法printArr,用于返回整数数组的内容。返回的字符串格式如:[10,20,50,34,100](只考虑整数数组,且只考虑一维数组)
- 提供这样一个工具方法getAverage,用于返回平均分。(只考虑浮点型数组,且只考虑一维数组)
- 定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果。
数组工具类
package com.bjpowernode.a01staticdemo1;
public class ArrayUtil {
//私有化构造方法
public ArrayUtil() {
}
//方法需要定义为静态的,方便调用
public static String printArr(int[] arr){
//字符串的拼接用 StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length - 1){
sb.append(arr[i] + "]");
} else {
sb.append(arr[i] + ", ");
}
}
return sb.toString(); // StringBuilder 转成 字符串 在返回
}
//返回平均值
public static double getAverage(double[] arr){
double sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum / arr.length;
}
}
测试类
package com.bjpowernode.a01staticdemo1;
public class TestDemo {
public static void main(String[] args) {
//测试工具类中的两个方法
int[] arr1 = {1,2,3,4,5};
String str = ArrayUtil.printArr(arr1);
System.out.println(str); //字符串可直接打印
double[] arr2 = {1.1,2.2,3.3,4.4,5.5};
double average = ArrayUtil.getAverage(arr2);
System.out.println(average);
}
}
参考链接:
面向对象进阶-01-static-静态变量_哔哩哔哩_bilibili