2022Java学习笔记三十(面向对象加强进阶:Static关键字、static修饰成员方法的基本用法、static实际应用案例、static注意事项)
一、static关键字的作用
成员变量可以分为2类:
1、静态成员变量(有static修饰,属于类,内存中加载一次):表示如在线人数信息、等需要被共享的信息,可以被共享访问
2、实例成员变量(无static修饰,存在于每个对象中):常表示姓名name、年龄age、等属于每个对象的信息
实例代码:
package com.zcl.d1_static_field;
public class User {
// 在线人数信息 静态成员变量 属于类,加载一次,可以被共享访问
public static int onLineNumber;
// 实例成员变量
private String name;
private int age;
public static void main(String[] args) {
// 1、类名.静态成员变量
User.onLineNumber++;
// 注意:同一个类中访问静态成员变量,类名可以省略不屑
System.out.println(onLineNumber); // 1
// 2、对象.实例成员变量
// System.out.println(name); 报错
User u1 = new User();
u1.name = "张三";
u1.age = 36;
System.out.println(u1.name);
System.out.println(u1.age);
// 不推荐 对象.静态成员变量
u1.onLineNumber++;
System.out.println(onLineNumber); // 2
}
}
二、static修饰成员方法的基本用法
成员方法的分类:
1、静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问
2、实例成员方法(无static修饰,属于对象),只能用对象触发访问
package com.zcl.d2_static_method;
public class Student {
private String name;
private int age;
/*
实例方法:无static修饰,属于对象的,通常表示对象自己的行为,可以访问对象的成员变量
*/
public void study(){
System.out.println(name+"好好学习,天天向上");
}
/*
静态成员方法:有static修饰,属于类,可以被类和对象共享访问
*/
public static void getMax(int a,int b){
System.out.println(a>b?a:b);
}
public static void main(String[] args) {
// 1、静态方法
Student.getMax(10,20);
// 注意:同一个类中访问静态方法,可以不写类名
getMax(20,90);
// 2、对象.实例方法
// study() 报错
Student s = new Student();
s.name = "张三";
s.study();
// 3、对象.静态方法(不推荐)
s.getMax(20,40);
}
}
三、static实际应用案例
工具类:
1、对于一些应用中多次需要用到的功能,可以将这些功能封装成静态方法,放在一个类中,这个类就是工具类
2、工具类的作用:一是方便调用,二是提高了代码复用性
工具类的原理和延申:
1、一次编写,处处可用
2、建议将工具类的构造器私有化,不让工具类产生对象,浪费内存
生成验证码工具类
package com.zcl.d3_Test;
import java.util.Random;
public class ToolClass {
/*
私有构造器(为了不被创建对象,直接通过类名访问)
*/
private ToolClass(){
}
// 验证码工具类 静态方法
public static String createCode(int n) {
// 验证码
// 1、使用String开发验证码
String chars = "abcdefghijklmnopquvwyzABCDEFGHIJKLMNOPQUVWXYZ0123456789";
// 定义变量存储5为随机字符为验证码
String code = "";
Random r = new Random();
for (int i = 0; i < n; i++) {
int index = r.nextInt(chars.length());
// 对应的所以提取字符
code += chars.charAt(index);
}
return code;
}
}
调用工具类
package com.zcl.d3_Test;
import java.util.Random;
public class Login {
public static void main(String[] args) {
// 调用验证码根据类(静态)
System.out.println("随机五位验证码:"+ToolClass.createCode(5));
}
}
定义数组工具类
定义工具类
package com.zcl.d3_Test;
public class ArrayUtils {
/**
* 工具类,把它的构造器私有化,不让其创建对象
*/
private ArrayUtils() {
}
/*
定义静态方法,工具方法【返回一组一维数组】
*/
public static String toString(int[] arr) {
if(arr != null){
String result = "[";
// 遍历数组
for (int i = 0; i < arr.length; i++) {
// 数组最后一个元素不需要 ,
result += (i == arr.length - 1 ? arr[i] : arr[i] + ",");
}
result += "]";
return result;
}else {
return null;
}
}
/*
定义返回平均分静态方法
*/
public static double getAverage(int[] arr) {
if (arr != null) {
// 总和 最大值 最小值
int max = arr[0];
int min = arr[0];
int sum = 0;
// 遍历数组
for (int i = 0; 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);
}else {
return 0.0;
}
}
}
测试工具类
package com.zcl.d3_Test;
public class Test {
public static void main(String[] args) {
// 调用数组工具类
int[] arr = {10,20,30,40};
System.out.println("原数组:"+arr);
System.out.println("输出一维数组:"+ArrayUtils.toString(arr));
System.out.println("输出平均分:"+ArrayUtils.getAverage(arr));
}
}
四、static注意事项
1、静态方法只能访问静态的成员,不可以直接访问实例成员(先创建对象)
2、实例方法可以访问静态的成员,也可以访问实例成员
3、静态方法中是不可以出现this关键字的,【没有对象】