【JAVA学习笔记】35 - 类变量

news2024/12/26 21:40:51

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/static_

一、类变量的引出

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

package com.yinhai.static_;

public class ChilGame {
    public static void main(String[] args) {
        Child child0 = new Child("xiaohuang");
        Child child1 = new Child("xiaowang");
        Child child2 = new Child("xiaoming");
        Child child3 = new Child("xiaobai");
        Child child4 = new Child("xiaoqing");
        int count = 0;
        child0.joinGame();
        count++;
        child1.joinGame();
        count++;
        child2.joinGame();
        count++;
        child3.joinGame();
        count++;
        child4.joinGame();
        count++;
        System.out.println("现在有" + count + "个小孩加入了游戏");
    }
}
class Child{
    private String name;
    public Child(String name){
        this.name = name;
    }
    public void joinGame(){
        System.out.println(name + "加入了游戏");

    }
}

旧方法的问题

1.count是一个独立于我们child对象的一个变量

2.以后访问count很麻烦

所以我们引出        类变量 / 静态变量

二、类变量快速入门

如果设计一个int count表示总人数,在创建一个小孩的时候就把count+1,并且count是所有对象共享的就可以了,所以现在使用类变量来解决上面的问题

                        

public class ChilGame {
    public static void main(String[] args) {
        Child child0 = new Child("xiaohuang");
        Child child1 = new Child("xiaowang");
        Child child2 = new Child("xiaoming");
        Child child3 = new Child("xiaobai");
        Child child4 = new Child("xiaoqing");
        int count = 0;
        child0.joinGame();
        child0.count++;
        child1.joinGame();
        child1.count++;
        child2.joinGame();
        child2.count++;
        child3.joinGame();
        child3.count++;
        child4.joinGame();
        child4.count++;
        System.out.println("现在有" + Child.count + "个小孩加入了游戏");
        System.out.println(child0.count);
        System.out.println(child1.count);
        System.out.println(child2.count);

        //即这个变量可以用类Child访问,Child.count,也可以被所有的对象调用
        //child0.count child1.count等等
    }
}
class Child {
    private String name;
    //定义一个变量 count 是一个类变量(静态变量) static 静态
    public static int count = 0;//该对象会被所有的对象共享

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

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

    }
}

                 

三、类变量的内存布局

        显而易见的,所有的对象的类变量的引用,都是指向类变量,如图

                

但这个类变量如何存放要看jdk的版本,在jdk7 及以前都是在方法区内有一个静态域,在jdk8当类加载的时候就会在堆里创建一个原型对象,所有的对象创建都会参照这个对象,count就存放在这个class类的最后

        ​​​​​​​        

无论如何1)static变量是所有对象共享的 (指在一个类内)

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

四、类变量的基本介绍

1.什么是类变量

        类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时修改的也是同一一个变量。这个从前面的图也可看出来。

2.如何定义类变量

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

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

3.如何访问类变量

        类名.类变量名或者 对象名.类变量名(静态变量的访问修饰符的访问权限和范围 和普通属性是一样的)

推荐使用:类名.类变量名

.

package com.yinhai.static_;

public class ViseStatic {
    public static void main(String[] args) {
        //类名.类变量名
        System.out.println(A.name);
        A a = new A();
        System.out.println("a.name=" + a.name);
        
    }
}
class A{
    public static String name = "name yinhai";
}

五、类变量注意事项和细节讨论

1.什么时候需要用类变量

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

2.类变量与实例变量(普通属性)的区别

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

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

4.类变量可以通过类名.类变量名  或者 对象名.类变量名来访问,java设计者推荐使用类名.类变量名方式访问(注意必须满足访问权限和范围)

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

6.类变量是在类加载时就初始化了,及使没有创建对象也能使用类名.变量名访问

7.类变量的声明周期是随着类的加载开始的,随着类的死亡而消失

六、类方法的基本介绍

类方法也叫静态方法

类方法的形式

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

        }

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

        }

类方法的调用

        使用方法:类名.类方法名 或者 对象名.类方法名

类方法的案例

package com.yinhai.static_;

public class StaticMethod {
    //统计学生的学费
    public static void main(String[] args) {
        Stu stu = new Stu("xiaowang");
        stu.payFee(1000);
        Stu stu1 = new Stu("xiaochen");
        stu1.payFee(2000);
        stu1.showFee();
    }
}
class Stu{
    private String name;
    private static double fee = 0;

    public Stu(String name) {
        this.name = name;
    }
    //1.当方法使用了static修饰后,该方法就是静态方法
    //2.静态方法就可以访问静态属性
    public static void payFee(double fee){
        Stu.fee += fee;
    }
    public static void showFee(){
        System.out.println("总学费有:" + Stu.fee);
    }
}

类方法经典的使用场景

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

如Util包内的Math 和 Arrays类等        即工具类的方法可以设置成静态方法

在实际开发中 往往会将一些通用方法设计成静态方法,这样不需要创建的时候就可以直接调用

比如打印一维数组等

public class StaticMethod {
    //统计学生的学费
    public static void main(String[] args) {
        System.out.println(MyTools.calSum(10 ,20));    
    }
}

class MyTools {
    //求出两个数的和
    public static double calSum(double n1, double n2 {
        return n1 + n2;
    }
}

七、类方法使用注意事项和细节讨论

0)  静态方法不能被重写 但是可以被子类继承

1)类方法和普通方法都是随着类的加载而加载,将结构细储存在方法区

        类方法中无this的参数

        普通方法隐含着this的参数

2)类方法可以通过类名调用,也可以通过对象名调用

3)普通方法和对象有关,需要对象名来调用

4) 类方法中不允许使用和对象有关的关键字 比如 this和super 普通方法可以

5)类方法(静态方法)中只能访问静态变量或静态方法

6)普通成员方法,既可以访问成员变量,也可以访问静态变量。 

class A{
    public static String name = "name yinhai";
    private int n1 = 100;
    private static int n2 = 200;
    public void say(){

    }
    public void ok(){
        System.out.println(n1);
        System.out.println(n2);
        say();
        hello();
    }
    public static void hello(){
        System.out.println(n2);
        System.out.println(A.n2);

    }
}

八、类变量和类方法课堂练习

1.

        ​​​​​​​​​​​​​​        

public class Test {
    static int count = 9;

    public void count() {
        System.out.println(" count=" + (count++));
    }

    public static void main(String args[]) {
        new Test().count();
        new Test().count();
        System.out.println(Test.count);
    }
}

                 

 2.

        ​​​​​​​        

public class TestPerson {
    public static void main(String[] args) {
        System.out.println(" Number of total is "+ Person.getTotalPerson());//静态方法可以直接调用
        Person p1 = new Person();
        System.out.println("Number of total is "+ Person.getTotalPerson());
    }
}

class Person{
    private int id;
    private static int total = 0;
    public static int getTotalPerson(){
        //id++;//静态方法只能调用静态属性 错误
        return total;
    }
    public Person(){//无参构造器 构造器本质是成员方法 可以调用成员变量或类变量
        total++;
        id = total;
    }
}

3.

public class TestPerson {
    public static void main(String[] args) {
        Person.setTotalPerson(3);
        new Person();
    }
}

class Person{
    private int id;
    private static int total = 0;
    public static void setTotalPerson(int total){
        // this.total = total; 类方法中不能带有this语句
        Person.total = total;
    }
    public Person(){//无参构造器 构造器本质是成员方法 可以调用成员变量或类变量
        total++;
        id = total;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker版本的Jenkins安装与更新技巧

因为jenkins/jenkins镜像默认带的jenkins版本比较低,导致安装完以后,很多插件因为版本问题无法安装。以下是最权威,最方便的安装教程。 1. 创建本地挂载目录 mkdir -p /mnt/dockerdata/jenkins/home/2. 修改挂载目录权限 chown -R 1000:10…

PaddleX场景实战:PP-TS在电压预测场景上的应用

时间序列是按照时间发生的先后顺序进行排列的数据点序列,简称时序。时间序列预测即运用历史的多维数据进行统计分析,推测出事物未来的发展趋势。时间序列预测是最常见的时序问题之一,在很多行业都有其应用,且通常时序预测效果对业…

js如何解决跨域问题?

🙂博主:锅盖哒 🙂文章核心:js如何解决跨域问题? 目录 前言:跨域问题的本质 详解:跨域问题的原因和限制 跨域问题的限制包括: 用法:解决跨域问题的方法 1. JSONP(J…

(完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类

文章目录 背景输入点直接输入邻接矩阵 背景 网上倒是有一些关于使用sklearn进行谱聚类的教程,但是这些教程的输入都是一些点的集合,然后根据谱聚类的原理,其会每两个点计算一次亲密度(可以认为两个点距离越大,亲密度越…

程序员节1024

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

期 货 分 仓,资 管 分 仓,跟单软件都有哪些特点?

期货分仓软件是一种用于期货交易的软件系统。通过该系统,机构可以在一个主账户中同时使用多个子账户操作多个期货合约,并且可以设置不同资金量的用户不同的开仓比例。 由于目前国内的期货市场对于国际市场的品种还处于不规范阶段:一方面是保证…

怎么去除视频水印?

当今社交媒体环境中,许多用户面临着怎么去除视频水印的挑战尤其是短视频领域的从业者,这些水印不仅影响了视频的美观度也限制了素材的流动性,为了解决这一问题许多人开始积极寻找有效的方法来去除水印,以便更灵活地使用视频内容&a…

经典卷积神经网络 - AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。当时,AlexNet在 ImageNet 大规模视觉识别竞赛中取得了优异的成绩,把深度学习模型在比赛中的正确率提升到一个前所未有的高度…

基于springboot实现广场舞团平台系统项目【项目源码+论文说明】计算机毕业设计

基于SPRINGBOOT实现广场舞团平台系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&am…

38.红黑树(王道第7章查找补充知识)

目录 一. 红黑树的定义 二. 红黑树的性质 三. 红黑树的插入 四. 红黑树的删除(略) 一. 红黑树的定义 红黑树是二叉排序树-左子树结点值≤根结点值≤右子树结点值。 与普通BST相比,有以下要求: ①每个结点或是红色,或是黑色的②根节点是…

探索C++赋值运算符重载的内部机制:手把手教你精通

W...Y的主页 😊 代码仓库分享💕 🍔前言: 前一篇博客中我们已经了解并学习了初始化和清理模块中的构造函数与析构函数,还有拷贝复制中的拷贝复制函数,它们都是类与对象中重要的成员,今天我们要…

构建实时视频聊天应用:使用WebRTC和Netty的完整指南

构建实时视频聊天应用:使用WebRTC和Netty的完整指南 使用WebRTC和Netty构建实时视频聊天应用准备工作步骤1:创建Netty服务器步骤2:创建WebRTC前端应用步骤3:处理WebRTC连接步骤4:处理Netty服务器端步骤5:运…

光流法动目标检测

目录 前言 一、效果展示 二、光流法介绍 三、代码展示 总结 前言 动目标检测是计算机视觉领域的一个热门研究方向。传统的方法主要基于背景建模,但这些方法对于光照变化、遮挡和噪声敏感。因此,研究人员一直在寻找更加鲁棒和有效的技术来解决这一问题。…

如何性能测试中进行业务验证?

在性能测试过程中,验证HTTP code和响应业务code码是比较基础的,但是在一些业务中,这些参数并不能保证接口正常响应了,很可能返回了错误信息,所以这个时候对接口进行业务验证就尤其重要。下面分享一个对某个资源进行业务…

CentOS 7设置固定IP地址

当我们安装了一个虚拟机或者装了一个系统的时候,经常会遇到需要设置固定ip的情况,本文就以Centos 7为例,讲述如何修改固定IP地址。 1、用ifconfig命令查看使用的网卡 如上图所示,我们就会看到我们目前使用的网卡名称 2、编辑网卡…

nginx创建站点“nginx: [emerg] host not found in upstream”错误

nginx配置语法上没有错误的,只是系统无法解析这个域名,所以报错. 解决办法就是添加dns到/etc/resolv.conf 或者是/etc/hosts,让其能够解析到IP。具体步骤如下: vim /etc/hosts 修改hosts文件,在hosts文件里面加上一句 127.0.0.1 localhost.localdomain x…

TiDB x 北京银行丨新一代分布式数据库的探索与实践

北京银行作为中国最大的城商行,坚持以数字化转型统领发展模式、业务结构、客户结构、营运能力、管理方式的五大转型,分布式数据库建设是北京银行数字化转型的重要组成部分。 在新时代、新监管、新业态、新模式的数字化转型背景下,监管要求的…

刚刚腾讯云发布了2023年双11优惠活动!终于等到你

终于等到你,想买台腾讯云服务器,等啊等,终于等来了2023年腾讯云双十一优惠活动,还好没让我失望,2核4G5M带宽的轻量应用服务器三年566,省钱了: txybk.com/go/1111 哈哈哈哈哈。 2023腾讯云双11优…

《低代码指南》——如何用维格表搭建CRM

信息 手机上就能随时随地记录客户信息更智能地进行部门协作、沟通让每一项客户沟通都有迹可循一个表格实现客户全生命周期管理企业如何在激烈的市场竞争中崭露头角,拥有自己的立足之地,CRM 系统必然是一大助力。但传统 CRM 系统功能太多太复杂,不够灵活,内部推广、维护又很…

Linux常用命令——clear命令

在线Linux命令查询工具 clear 清除当前屏幕终端上的任何信息 补充说明 clear命令用于清除当前屏幕终端上的任何信息。 语法 clear实例 直接输入clear命令当前终端上的任何信息就可被清除。 在线Linux命令查询工具