一、概念
static单词意思是静止的,在Java语言中表示静态的。
二、作用
可以去修饰成员变量,成员方法,被static修饰的成员,称为类的成员(我们也可称为静态成员)。静态成员会随着类的加载而进入方法区内存(早于对象的创建),静态成员使用时可以直接用类名调用。而没有被static修饰的成员,称为实例成员,实例成员的使用必须要依赖对象取调用。
三、静态变量的定义
在成员变量前加上static修饰 即可
public class StaticTest { public static String city = "合肥"; }
四、静态变量的使用
静态变量有2种访问方式
- 用类名去调用(常用)
- 用对象取调用
分别如下
public class Abc { public static void main(String[] args) { // 用类名去调用 System.out.println(StaticTest.city); // 合肥 // 用对象取调用 StaticTest st = new StaticTest(); System.out.println(st.city); // // 合肥 } }
五、静态变量内存机制
- 静态变量在内存中只有一份数据在方法区中,不管在内存中该类有几个对象,静态变量的数据也只有一份数据,通常用来做数据共享。
- 非静态变量(实例变量)随着对象在内存中创建而存在,该类有几个对象就有几份非静态变量的数据
六、静态变量的实际使用
静态变量可以用来实现一些静态常量工具类,比如
// 静态常量工具类 public class QuestionType { public static final String CHOICE = "选择题"; public static final String JUDGE = "判断题"; public static final String FILL = "填空题"; public static final String SHORT = "简答题"; }
之后,再给比如试题选择类型的时候,就可以直接使用类名.变量名的方式来给试题定义类型,而不用手动书写,导致有可能的书写错误。
七、静态方法的定义
使用static关键字修饰的方法就是静态方法,如下
public class Calc { public static int max(int a, int b){ return a > b ? a : b; } }
八、静态方法的使用
静态方法在类加载到方法区后无需定义对象,直接用类名就可以调用。当然也可以使用对象调用,
- 用类名去调用(常用)
- 对象取调用
public class Abc { public static void main(String[] args) { // 类名调用 System.out.println(Calc.max(5, 10)); // 10 // 对象调用 Calc math = new Calc(); System.out.println(math.max(100, 200)); // 200 } }
九、什么情况下用静态方法
- 很多工具类内部定义的就是静态方法,例如数组工具类Arrays,数学工具类Math。
- 这样做的好处就是我们调用方法无需创建对象调用,直接类名调用就可以方便多了。
- 开发中如果我们需要将代码抽取形成工具,也可以参考这个方式。
十、静态方法访问成员时的特点
- 静态方法只能访问静态成员(静态变量、静态方法)
- 非静态方法可以访问非静态成员、可以访问静态(静态变量、静态方法)
为什么会是这样,因为从存在的时机来看静态成员先于非静态成员存在,因此后存在的可以访问先存在的成员(静态成员随着类加载而存在,非静态成员只有对象创建了才会存在)
十一、静态方法的示例
对一个字符串进行加密(简单使用)
// StringUtils.java public class StringUtils { // 密码加密 public static String encryption(String pwd){ // 获取字符串中的每一个字符 String => char[] char[] chars = pwd.toCharArray(); for (int i = 0; i < chars.length; i++) { // 每个字符 +2 chars[i] = (char)(chars[i] + 2); } return new String(chars); // 返回新密码 } } // Abc.java public class Abc { public static void main(String[] args) { String pwd = "xlj123abc"; // 使用静态方法工具类,对密码进行加密 String newPwd = StringUtils .encryption(pwd); System.out.println(newPwd); // znl345cde } }