【Java基础笔记】第十四章 static静态关键字

前言

  • 该文章为Java基础自学笔记
  • 其他内容:Java基础学习笔记目录
  • 学习用书:
    《Java核心技术 卷Ⅰ 基础知识(第10版)》
    《Java经典编程300例》

第十四章 static静态关键字

14.1 static关键字的作用

  • static是静态的意思,可以修饰成员变量,表示该成员变量只在内存中存储一份,可以被共享访问、修改

14.2 static修饰成员变量

14.2.1 静态成员变量

  • 有static修饰,属于类,内存中加载一次
  • 常表示如在线人数信等需要被共享的信息,可以被共享访问
  • 访问方式:
	类名.静态成员变量 // 推荐
	对象.静态成员变量 // 不推荐

14.2.2 实例成员变量

  • 没有static修饰,存在于每个对象中
  • 常表示姓名name、年龄age等属于每个对象的信息
  • 访问方式:
	对象.实例成员变量

14.2.3 static修饰成员变量的内存原理

static修饰成员变量的内存原理

14.3 static修饰成员方法

14.3.1 静态成员方法

  • 有static修饰,属于类
  • 建议用类名访问,也可以用对象访问
  • 使用场景:
    • 表示对象自己的行为,且方法中需要访问实例成员,则该方法必须声明成实例方法

14.3.2 实例成员方法

  • 没有static修饰,属于对象
  • 只能用对象触发访问
  • 使用场景:
    • 如果该方法是以执行一个通用功能为目的,或需要方便访问,则可以声明成静态方法

14.3.3 static修饰成员方法的内存原理

static修饰成员方法的内存原理

14.4 static实际应用

14.4.1 工具类

  • 对于一些应用程序中多次需要用到的功能,可以讲这些功能封装成静态方法,放在一个类中,这个类就是工具类
  • 工具类的作用:
    • 方便调用
    • 提高代码复用
    • 不需要创建对象,节省内存

14.4.2 工具类原理和延伸

  • 一次编写,处处可用
  • 将工具类的构造器私有,不让工具类对外产生对象

【static应用案例1】设计验证码工具类

  • 需求:
    • 在企业的管理系统中,通常需要在一个系统的很多业务处使用验证码进行防刷新等安全控制
    • 设计验证码工具类,实现在登录和注册等多处地方均可实现验证码功能
  • 代码
public class VerifyTool {

	// 构造器私有
    private VerifyTool() {
    }
    
    /**
     * 生成验证码
     * @param length 验证码长度
     * @return 验证码
     */

    public static String createCode(int length) {
        String data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String code = "";
        Random r = new Random();
        for (int i = 0; i < length; i++) {
            int index = r.nextInt(data.length());
            code += data.charAt(index);
        }
        return code;
    }
}
public class Login {
    public static void main(String[] args) {
        System.out.println("验证码:" + VerifyTool.createCode(5));
    }
}
public class Register {
    public static void main(String[] args) {
        System.out.println("验证码:" + VerifyTool.createCode(5));
    }
}

【static应用案例2】设计数组工具类

  • 需求:
    • 在实际开发中,经常会遇到一些数组使用的工具类,请按照如下要求编写一个数组的工具类:ArrayUtils
    • 我们知道数组对象直接输出的时候是输出对象的地址,而项目中很多地方都需要返回数组的内容,请在ArrayUtils中提供一个工具类方法toString,用于返回整数数组的内容,返回的字符串格式如:[10, 20, 50, 34, 100](只考虑整数数组,且只考虑一维数组)
    • 经常需要统计平均值,平均值为去掉最低分和最高分后的分支,请提供这样一个工具方法getAverage,用于返回评分值(只考虑浮点型数组,且只考虑一维数组)
    • 定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果
  • 代码
public class ArrayUtils {
     /**
     * 构造器私有
     */
    private ArrayUtils(){
    }
    
    /**
     * 数组格式化输出工具
     * @param arr 数组
     * @return 数组输出结果
     */
    public static String toString(int[] arr) {
        if (arr != null) {
            String rs = "[";
            for (int i = 0; i < arr.length; i++) {
                rs += (i == arr.length - 1 ? arr[i] : arr[i] + ", ");
            }
            rs += "]";
            return rs;
        } else {
            return null;
        }
    }

    /**
     * 求平均值工具
     * @param arr 数组
     * @return 平均值
     */
    public static double getAverage(int[] arr) {
        int max = arr[0];
        int min = arr[0];
        int sum = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
            sum += arr[i];
        }
        return (sum - max - min) * 1.0 / (arr.length - 2);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        int[] arr = {10, 20, 50, 34, 100};
        int[] arr1 = {};
        int[] arr2 = null;
        System.out.println(ArrayUtils.toString(arr)); // [10, 20, 50, 34, 100]
        System.out.println(ArrayUtils.toString(arr1)); // []
        System.out.println(ArrayUtils.toString(arr2)); // null
        System.out.println(ArrayUtils.getAverage(arr)); // 34.666666666666664
    }
}

14.5 static访问注意事项

  • 静态方法只能访问静态成员,不可以直接访问实例成员
  • 实例方法可以访问静态成员,也可以访问实例成员
  • 静态方法中不可以出现this关键字

版权声明:本文为qq_15608603原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。