• 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.1 类变量和类方法


    非零基础自学Java (老师:韩顺平)

    ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】

    第10章 面向对象编程(高级部分)

    10.1 类变量和类方法
    10.1.1 类变量 - 提出问题

    有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。

    在这里插入图片描述

    10.1.2 传统解决方法
    • 在main方法中定义一个变量 count
    • 当有一个小孩加入游戏就 count ++ , 最后count就记录着有多少个人在玩

    问题:

    • count 独立于对象,尴尬
    • 访问count,没有使用到面向对象
    10.1.3 类变量快速入门

    举个栗子

    package com.dingjiaxiong.static_;
    
    /**
     * ClassName: ChildGame
     * date: 2022/9/3 15:14
     *
     * @author DingJiaxiong
     */
    
    public class ChildGame {
        public static void main(String[] args) {
            Child child1 = new Child("孙悟空");
            child1.join();
            child1.count ++;
    
            Child child2 = new Child("猪八戒");
            child2.join();
            child2.count ++;
    
            Child child3 = new Child("唐僧");
            child3.join();
            child3.count ++;
    
            Child child4 = new Child("沙悟净");
            child4.join();
            child4.count ++;
    
            System.out.println("共有" + Child.count + "个小孩加入了游戏");
    
            System.out.println(child1.count);
            System.out.println(child2.count);
            System.out.println(child3.count);
            System.out.println(child4.count);
    
        }
    }
    
    class Child{
        private String name;
    
        public static int count = 0;
    
        public Child(String name) {
            this.name = name;
        }
    
        public void join(){
            System.out.println(name + "加入了游戏...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    运行结果

    在这里插入图片描述

    10.1.4 类变量内存布局

    【static变量是对象共享】

    共识

    • static变量是一个类所有对象共享
    • static类变量,在类加载的时候就生成了

    在这里插入图片描述

    10.1.5 什么是类变量

    类变量也叫静态变量/静态属性,是该类的所有对象共享的变量。

    任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。这个从前面的图也可看出来。

    10.1.6 如何定义类变量

    定义语法

    访问修饰符 static 数据类型 变量名;【推荐】
    
    static 访问修饰符 数据类型 变量名;
    
    • 1
    • 2
    • 3
    10.1.7 如何访问类变量
    • 类名.类变量名【推荐】
    • 对象名.类变量名

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

    举个栗子

    package com.dingjiaxiong.static_;
    
    /**
     * ClassName: VisitStatic
     * date: 2022/9/3 16:01
     *
     * @author DingJiaxiong
     */
    
    public class VisitStatic {
        public static void main(String[] args) {
            System.out.println(A.name);
            A a = new A();
            System.out.println(a.name);
        }
    }
    
    class A{
        public static String name = "韩老师666";
        private int num = 10;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果

    在这里插入图片描述

    10.1.8 类变量使用注意事项和细节讨论
    • 什么时候需要用类变量

      当需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):比如:定义学生类,统计所有学生共交多少钱。

    • 类变量与实例变量(普通属性)区别

      类变量是该类的所有对象共享的,而实例变量是每个对象独享的。

    • 加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量

    • 类变量可以通过类名.类变量名或者对象名.类变量名来访问,但java设计者推荐使用类名.类变量名方式访问。【前提是满足访问修饰符的访问权限和范围】

    • 实例变量不能通过类名.类变量名方式访问。

    • 类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了,就可以使用类变量了。

    • 类变量的生命周期是随类的加载开始,随着类消亡而销毁。

    举个栗子

    package com.dingjiaxiong.static_;
    
    /**
     * ClassName: StaticDetail
     * date: 2022/9/3 16:07
     *
     * @author DingJiaxiong
     */
    
    public class StaticDetail {
        public static void main(String[] args) {
            B b = new B();
            System.out.println(B.n2);
    
            System.out.println(C.address);
        }
    }
    
    class B{
        public int n1 = 100;
        public static int n2 = 200;
    }
    
    class C{
        public static String address = "北京";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    运行结果

    在这里插入图片描述

    10.1.9 类方法基本介绍

    类方法也叫静态方法。

    形式:

    访问修饰符 static 数据返回类型 方法名(){}  【推荐】
    
    static 访问修饰符 数据返回类型 方法名(){}
    
    • 1
    • 2
    • 3
    10.1.10 类方法的调用

    使用方式【前提是满足访问修饰符的访问权限…】

    • 类名.方法名
    • 对象名.类方法名
    10.1.11 类方法举个栗子
    package com.dingjiaxiong.static_;
    
    /**
     * ClassName: StaticMethod
     * date: 2022/9/3 16:16
     *
     * @author DingJiaxiong
     */
    
    public class StaticMethod {
        public static void main(String[] args) {
            Stu tom = new Stu("Tom");
            Stu.payFee(100);
    
            Stu marry = new Stu("Marry");
            Stu.payFee(200);
    
            Stu.showFee();
    
            System.out.println("9开平方的结果是 = " + Math.sqrt(9));
    
            System.out.println(MyTools.calSum(10 ,30));
        }
    }
    
    class MyTools{
        //求两个数的和
        public static double calSum(double n1 , double n2){
            return n1 + n2;
        }
    }
    
    class Stu{
        private String name;
        private static double fee = 0;
    
        public Stu(String name) {
            this.name = name;
        }
    
        public static void payFee(double fee){
            Stu.fee += fee;
        }
    
        public static void showFee(){
            System.out.println("总学费有 :" + Stu.fee);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    运行结果

    在这里插入图片描述

    10.1.12 类方法经典的使用场景

    当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。

    在程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样不需要创建对象就可以使用了,比如打印一维数组,冒泡排序,完成某个计算任务等。

    10.1.13 类方法使用注意事项和细节讨论
    • 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区∶
      • 类方法中无this的参数
      • 普通方法中隐含着this的参数
    • 类方法可以通过类名调用,也可以通过对象名调用。
    • 普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。
    • 类方法中不允许使用和对象有关的关键字,比如this和super。普通方法(成员方法)可以。
    • 类方法(静态方法)中只能访问静态变量或静态方法。
    • 普通成员方法,既可以访问非静态成员,也可以访问静态成员。

    【静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员(必须遵守访问权限)】

  • 相关阅读:
    工业数据采集分析系统 自动化工厂与MES的中转站
    C语言入门 Day_11 判断的嵌套
    053基于web+springboot的宠物咖啡馆平台的设计与实现
    升余弦滤波器的FPGA实现
    [护网杯 2018]easy_tornado 解析
    开源组件与中间件的学习笔记3
    PAM从入门到精通(二十三)
    TypeScript_Ts简介
    Mybatis小记
    应用在温度测量仪领域中的数字温度传感芯片
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126900709