【Java基础】类方法和类变量

第二阶段

类变量和类方法

【对象实例共享】同一个类所有对象共享

静态变量是被对象共享的,因此不影响对静态变量的使用

【静态变量保存在哪里】说法不一,看版本

静态变量是放在堆里面的(jdk8之后)(jdk8之前的话是在方法区里面)有待补充

【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 + "加入了游戏");
    }
}

但是在这个里面count是独立于对象的,所以这里引出了类变量(静态变量)
下面是改进

public class ChildGame {
    public static void main(String[] args) {
        //int count = 0;
        Child child01 = new Child("白骨精");
        child01.join();
        //count++;
        child01.count++;
        Child child02 = new Child("狐狸精");
        child02.join();
       // count++;
        child02.count++;
        Child child03 = new Child("老鼠精");
        child03.join();
        //count++;
        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 + "加入了游戏");
    }
}

上面改完之后就是这样了,主要是count成为了共享的变量,【对象实例共享】所以不管是Child.count``child01.count``child02.count``child03.count都是3

什么是类变量

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

-------------补充一个内存实例图---------------------待补充

如何去定义静态变量

定义语法
访问修饰符 static 数据类型 变量名;【推荐】
static 访问修饰符 数据类型 变量名;
如何访问
类名.变量名 【推荐】
或者
对象名.类变量名【静态变量的访问修饰符的访问权限和范围是和普通属性是一样的】
类变量名是随着类的加载而创建的,所以即使没有创建对象实例也可以访问

package com.hspdeu.stc_;

public class VisitStatic {
    public static void main(String[] args) {
        //类名.类变量名
        System.out.println(A.name);
        A jshdjh = new A();
        //对象名.类变量名
        System.out.println(jshdjh.name);

    }
}

class A {
    public static String name = "hanshun";

}

类变量的使用细节

1/什么时候需要用类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量)
2/类变量与实例变量(普通属性)的区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的
3/加上static称为类变量或者静态变量,否则称为实例变量/普通变量/非静态变量
4/类变量可以通过////类名.类变量名【推荐】 来访问
5/实例变量不能通过 类名.类变量名 方式访问
6/类变量名是在类加载的时候就初始化了,也就是说,即使你没有创建对象,只要类加载了,就可以使用类变量了
7/类变量的生命周期是随着类的加载开始,随着类消亡而销毁

类方法

类方法基本介绍
也叫静态方法
访问修饰符 static 数据返回类型 方法名(){}
类方法的调用
使用方法:类名.类方法名 或者 对象名.类方法名

[无法从上下文中引用非静态方法]注意这一点

类方法的基本使用

package com.hspdeu.stc_;

public class StaticMethod {
    public static void main(String[] args) {
        Stu tom = new Stu("tom");
        //System.out.println("tom 的学费是"+ Stu.payFee(1000););
        tom.payFee(100);
        Stu jack = new Stu("jack");
        //System.out.println("jack的学费是" + Stu.payFee(2000););
        jack.payFee(200);

        //输出当前收到的总学费
        Stu.showFee();
    }
}

class Stu{
    private String name;
    //定义一个静态变量,累计学费
    public static double fee = 0;

    public Stu(String name) {
        this.name = name;
    }
    //当方法使用了static修饰后,该方法就是一个静态方法
    public static void payFee(double fee){
        Stu.fee += fee;//累积
    }
    public static void showFee(){
        System.out.println("总学费有" + Stu.fee);
    }
}

类方法的使用细节
1/类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区
类方法中无this的参数
普通方法中隐含着this的参数
2/类方法可以通过类名调用,也可以通过对象名调用
3/普通方法和对象有关,需要通过对象名调用,不能通过类名调用
4/类方法中不允许使用和对象有关的关键词,比如this和super,普通方法可以
5/类方法中只能访问静态变量或者静态方法
6/普通成员方法既可以访问普通变量也可以访问静态变量
小结静态方法,只能访问静态的成员;非静态的方法可以访问静态和非静态成员。(必须遵守访问权限)

posted @   missSherry1014  阅读(152)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示