【Java笔记】11 类变量和类方法

一、类变量

1.1 什么是类变量

类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象访问时,取到的都是相同值,任何一个该类的对象去修改时,修改的也是同一个变量。

1.2 定义类变量

访问修饰符 static 数据类型 变量名;[推荐]

static 访问修饰符 数据类型 变量名;

1.3 访问类变量

类名.类变量名 或 对象名.类变量名

静态变量的访问修饰符的访问权限和范围和普通属性是一样的。

  1. public class VisticStatic {
  2. public static void main(String[] args) {
  3. //类名.类变量名
  4. //类变量随着类的加载而创建,没有创建对象实例也可以访问
  5. System.out.println(A.name);
  6. A a = new A();
  7. //对象名.类变量名
  8. System.out.println("a.name=" + a.name);
  9. }
  10. }
  11. class A{
  12. // 类变量的访问必须遵守访问权限
  13. public static String name = "lll"; // 类变量
  14. private int num = 10; // 普通属性/普通成员变量/非静态属性/非静态成员变量/实例变量
  15. }

1.4 类变量的内存布局

【Java笔记】11 类变量和类方法 - 图1

有不同说法 可能由于jdk版本不同 在堆或者静态域

但 static变量是对象共享,在类加载时就生成了

1.5 注意事项

  1. 什么时候使用类变量 需要让某个类的所有对象共享一个变量时
  2. 类变量与实例变量(普通属性)区别 类变量是该类的所有对象共享的,实例变量是每个对象独享的。
  3. 加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
  4. 实例变量不能通过类名.类变量名访问
  5. 类变量的生命周期随类的加载开始,随类消亡而销毁
  1. public class StaticDetail {
  2. public static void main(String[] args) {
  3. B b = new B();
  4. // System.out.println(B.n1);//没static,不能用类名.变量名表示
  5. System.out.println(B.n2);
  6. //静态变量是类加载的时候,就创建了,没有创建对象实例也可以通过类名.类变量名来访问
  7. System.out.println(C.address);
  8. }
  9. }
  10. class B{
  11. public int n1 = 100;
  12. public static int n2 = 200;
  13. }
  14. class C{
  15. public static String address = "xxx";
  16. }

二、类方法

2.1

类方法也叫静态方法

访问修饰符 static 数据返回类型 方法名(){} 【推荐】

static 访问修饰符 数据返回类型 方法名(){}

2.2 类方法的调用

类名.类方法名 或 对象名.类方法名

  1. public class StaticMethod {
  2. public static void main(String[] args) {
  3. Stu tom = new Stu("tom");
  4. //tom.payFee(100);或
  5. Stu.payFee(100);
  6. Stu mary = new Stu("mary");
  7. //mary.payFee(200);或
  8. Stu.payFee(200);
  9. Stu.showFee(); // 300
  10. }
  11. }
  12. class Stu {
  13. private String name;//普通成员
  14. //静态变量累加学生学费
  15. private static double fee = 0;
  16. public Stu(String name) {
  17. this.name = name;
  18. }
  19. //static修饰后,该方法是静态方法,静态方法可以访问静态属性/变量
  20. public static void payFee(double fee) {
  21. Stu.fee += fee;
  22. }
  23. public static void showFee() {
  24. System.out.println("总学费有:" + Stu.fee);
  25. }
  26. }

2.3 使用场景

方法中不涉及任何和对象相关的成员,如工具类中的方法 Math类,开方 Math.sqrt(9);

2.4 注意事项

类方法和普通方法都是随类的加载而加载,将结构信息存储在方法区

类方法中无this的参数,普通方法中隐含着this的参数

类方法不允许使用和对象有关的关键字,如this和super

类方法中只能访问静态变量或静态方法,普通成员方法,既可以访问静态成员也可以访问非静态成员(成员即变量和方法)。