本文最后更新于 2024-10-13,文章内容可能已经过时。

{mtitle title=“类变量和类方法”/}

{bilibili bvid=“BV1fh411y7R8” page=“374”/}

{dotted startColor=“#ff6c6c” endColor=“#1989fa”/}

1. 提出问题:

image-20231008195039643

运用Java解决问题:

package com.ljj.static_;

public class ChildGame {
    public static void main(String[] args) {
        int count = 0;

        Child child01 = new Child("小明同学");
        child01.join();
        count++;
        Child child02 = new Child("小红同学");
        child02.join();
        count++;
        Child child03 = new Child("小黄同学");
        child03.join();
        count++;

        System.out.println("一共有"+count+"同学");
    }
}
class Child{ //类
    private String name;

    public Child(String name){
        this.name = name;
    }

    public void join(){
        System.out.println(name+"加入了游戏.......");
    }
}

使用类变量改进:

package com.ljj.static_;

public class ChildGame {
    public static void main(String[] args) {
        int count = 0;

        Child child01 = new Child("小明同学");
        child01.join();
        child01.count++;
        Child child02 = new Child("小红同学");
        child02.join();
        child02.count++;
        Child child03 = new Child("小黄同学");
        child03.join();
        child03.count++;
        System.out.println("一共有"+Child.count+"同学");
    }
}
class Child{ //类
    private String name;
    //定义一个变量count,是一个类变量(静态变量)static 静态
    //该变量足以大的特点就是会被本类里面的所有对象实例共享
    public static int count = 0;
    public Child(String name){
        this.name = name;
    }

    public void join(){
        System.out.println(name+"加入了游戏.......");
    }
}

2. 类变量内存布局:

文章参考

JAVA的内存图理解(栈,堆,方法区)

Java static变量保存在哪?

a. 静态变量被对象共享

b. 因此不影响对静态对象的使用

不管在static变量在哪里:

  1. static变量是同一个类所有对象共享的

  2. static类变量,在类加载的时候就生成了

3. 定义类变量

定义语法:

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

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

如何访问:

类名.类变量名【推荐使用】

对象名.类变量名【静态变量的访问修饰符的访问权限和范围和普通属性一样】

//代码示例: 
package com.ljj.static_;

public class VisitStatic {
    public static void main(String[] args) {
        System.out.println(A.name);//示例1
        A a  =  new A();
        System.out.println(a.name);//示例2
    }
}
class A{
    //类变量
    public static String name="小明";
}
  • 实例变量不能通过 类名.类变量名 方式访问

    image-20231008210000179
  • 即使没有创建对象,类加载了也能访问

    image-20231008210334964

4、类方法

  • 基本介绍

    静态方法: 访问形式如下

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

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

  • 调用方式:

    类.类方法名 OR 对象.类方法名【访问条件同上】

    //代码示例:
    package com.ljj.static_;
    
    public class StaticMethod {
        public static void main(String[] args) {
    
            Stu tom = new Stu("tom");
            tom.payFee(1000);
            Stu marry = new Stu("marry");
            marry.payFee(10086);
            Stu.showFee();
        }
    }
    class Stu{
    
    
        private String stuName;
        //累计学费
        private static double fee = 0;
    
        public Stu(String stuName) {
            this.stuName = stuName;
        }
        //说明:
        //1. 当方法使用了static修饰后,该方法就是静态方法
        //2. 静态方法就可以访问静态属性/ 变量
        public static void payFee(double fee){
            Stu.fee += fee;
        }
    
        public static void showFee(){
            System.out.println("总学费有:"+Stu.fee);
        }
    }
    
    image-20231008211848364
  • 开发自己的工具类时,可以将方法做成静态方法,方便调用

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

  2. 类方法中没有this的参数,普通方法中隐含着this的参数

  3. 类方法可以通过类名调用。也可以通过对象名调用

  4. 普通方法和对象有关,需要通过对象名调用,不能通过类名调用

  5. 类方法中不允许使用和对象有关的关键字,比如this和supe。普通方法(成员方法)可以。

  6. 类方法(静态方法)中只能访问静态变量或静态方法。

    **口诀:**静态方法只能访问静态成员。

    理解: 静态方法可以通过形参传入对象的方式,间接访问到非静态的成员

  7. 普通成员方法,既可以访问非静态成员,也可以访问静态变量(方法)。

小结:静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员(但是必须要遵守访问权限)