静态关键字:static
1.静态关键字:static
(1).static的作用.修饰成员变量的用法
- static关键字的作用
- static是静态的意思,可以修饰成员变量和成员方法.
- static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问.修改.
举个例子:
package top.xiaoytongxue.day02;
public class User {
//这个onlineNumber就是成员变量
public static int onlineNumber = 162;
private String name;
private int age;
}
2.成员变量可以分为2类
- 静态成员变量(有static修饰,属于类,内存中加载一次):常表示如在线人数信息.等需要被共享的信息,可以被共享访问
public class User{
//静态成员变量
public static String onlineNumber = 161;
}
类名.静态成员变量.(推荐)
对象.静态成员变量.(不推荐)
public class User{
public static String onlineNumber = 161;
//实例成员变量
对象.实例成员变量 (这种可以调用实例成员变量)
private String name;
private int age;
}
总结:
1.成员变量的分类和访问分别是什么样的?
- 静态成员变量(有static修饰,属于类,加载一次,可以被共享访问),访问格式:
类名.静态成员变量(推荐)
对象.实例成员变量(不推荐)
2.两种成员变量各自在什么情况下定义? - 静态成员变量:表示在线人数等需要被共享的信息
- 实例成员变量:属于每个对象,且每个对象信息不同时(name,age,...)
(2).static修饰成员患变量的内存原理
首先方法区加载User.class类,然后在栈内存中加载main方法,在栈内存中User u1 和User u2中地址指向堆内存中,小y和小h都只指向一个static类静态变量区.
package top.xiaoytongxue.day02;
public class User {
//静态成员变量:有static修饰,属于类,加载一次,可以被共享访问
public static int onlineNumber = 162;
// 实例成员变量:无static修饰,属于每个对象
private String name;
private int age;
public static void main(String[] args) {
// 1.类名.静态成员变量
System.out.println(User.onlineNumber);
System.out.println(onlineNumber);
User.onlineNumber++;
//System.out.println(name); 不能直接访问私有实例成员变量
// 2.创建用户对象:对象.实例成员变量
User u1 = new User();
u1.name = "小y";
u1.age = 18;
System.out.println(u1.name);
System.out.println(u1.age);
// 对象名称.静态成员变量(不推荐)
u1.onlineNumber++;
User u2 = new User();
u2.name = "小h";
u2.age = 29;
System.out.println(u2.name);
System.out.println(u2.age);
//对象名称.静态成员变量(不推荐)
u2.onlineNumber++;
System.out.println(User.onlineNumber);
}
}
(3).static修饰成员方法的基本用法
1.成员方法的分类:
- 静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问.
- 实例成员方法(无static修饰,属于对象),只能用对象触发访问.
使用场景
- 表示对象自己的行为的,且方法中奖需要访问实例成员的,则该方法必须申明成实例方法.
- 如果该方法是以执行一个共用功能为目的,则可以申明成静态方法.
总结
1.成员方法的分类和访问分别是什么样的?
- 静态成员方法(有static修饰,属于类和对象共享)访问格式:
类名.静态成员方法.
对象.静态成员方法.(不推荐) - 实例成员方法(无static修饰,属于对象)的访问格式:
对象.实例成员方法
2.每种成员方法的使用场景是怎么样的? - 表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法.
- 如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明成静态方法.
案例:做一个随机验证码 用静态成员方法
package top.xiaoytongxue.day01;
import java.util.Random;
public class demo1 {
public static void main(String[] args) {
createCode(5);
}
/***
* 这里是将这个随机生成验证码做成了一个静态方法方便调用
* @param n
* @return
*/
public static String createCode(int n){
//1.使用String开发一个验证码
String chars = "abcdefgfijklmnopqrstuvwsyzABCDEFGHIJKLMNOPJRSTUVWSYZ0123456789";
//2.定义一个变量用于存储一个五位随机随机的字符作为验证码
String code = "";
//3.循环
Random r = new Random();
for (int i = 0; i < n; i++) {
int index = r.nextInt(chars.length());
//4.根据随机出来的索引提取相应的字符
code += chars.charAt(index);
}
System.out.println("随机的验证码为:" + code);
return code;
}
}
(4).static修饰成员方法的内存原理

(5).static实际应用案例:设计工具类
1.什么是工具类?
- 工具类中定义的都是一些静态方法,每个方法都是以完成一个共用的功能为目的.
举个例子,在企业的管理系统中,通常需要在一个系统的很多业务处使用验证码进行防刷新等安全控制.验证码就很好的解决了这个问题.但是如果登录和注册等多处地方都存在验证码逻辑,就会导致同一个功能多处开发,会出现代码重复度过高.
工具类的好处
- 一是调用方便,二是提高了代码复用(一次编写,处处可用)
为什么工具类中的方法不用实例方法做? - 实例方法需要创建对象调用,此时用对象只是为了调用方法,这样只会浪费内存.
工具类的定义注意 - 建议将工具类的构造器进行私有,工具类无需创建对象.
- 里面都是静态方法,直接用类名访问即可.
总结
1.工具类是什么,有什么好处?
- 内部都是一些静态方法,每个方法完成一个功能
- 一次编写,处处可用,提高代码的重用性
2.工具类有什么要求? - 建议工具类的构造器私有化处理
- 工具类不需要创建对象
案例
/*
静态方法,工具方法
*/
public static double getAverage(int[] arr){
// 求值 最大值 最小值
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;
}
/*
静态方法,工具方法
*/
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;
}
}
}
(6).static的注意事项总结[面试热点]
static访问注意实现:
- 静态方法只能访问静态的成员,不可以直接访问实例成员
- 实例方法可以访问静态的成员,也可以访问实例成员
- 静态方法中是不可以出现this关键字的.
package top.xiaoytongxue.day02;
public class demo2 {
//静态成员变量
public static int onlineNumber;
//实例成员变量
private String name;
public static void getMax(){
// 1.静态方法可以直接访问静态成员
System.out.println(demo2.onlineNumber);
System.out.println(onlineNumber);
inAddr();
//3.静态方法中不能出现this关键字
System.out.println(this);
}
private static void inAddr() {
}
public void run(){
//2.实例方法可以直接访问静态成员,也可以访问实例成员
System.out.println(demo2.onlineNumber);
System.out.println(onlineNumber);
demo2.getMax();
getMax();
System.out.println(name);
sing();
}
private void sing() {
}
}
浙公网安备 33010602011771号