Java中static关键字的使用与练习

Java中static关键字的使用与练习

在Java编程中,static关键字是一个非常重要的概念,它用于修饰类的成员变量和方法。通过static关键字,我们可以创建与类本身关联而不是与类的实例关联的成员。下面,我们将详细探讨static关键字在Java中的使用,并通过一些简单的练习来加深理解。

一、static修饰变量

当使用static修饰变量时,这个变量就变成了类的静态变量,也叫类变量。静态变量属于类本身,而不是类的某个具体实例。无论创建多少个对象,静态变量都只有一份拷贝。

public class StaticDemo {
    // 静态变量
    public static int staticVar = 42;
    
    // 非静态变量
    public int instanceVar;
    
    public static void main(String[] args) {
        // 不需要创建对象,可以直接通过类名访问静态变量
        System.out.println(StaticDemo.staticVar); // 输出:42
        
        // 创建StaticDemo的实例
        StaticDemo obj1 = new StaticDemo();
        StaticDemo obj2 = new StaticDemo();
        
        // 通过对象也可以访问静态变量,但通常不推荐这样做
        System.out.println(obj1.staticVar); // 输出:42
        System.out.println(obj2.staticVar); // 输出:42
        
        // 修改静态变量的值
        StaticDemo.staticVar = 100;
        
        // 静态变量的值改变后,所有对象访问的都是修改后的值
        System.out.println(obj1.staticVar); // 输出:100
        System.out.println(obj2.staticVar); // 输出:100
    }
}

二、static修饰方法

使用static修饰方法时,这个方法就变成了类的静态方法。静态方法属于类本身,可以通过类名直接调用,无需创建对象。静态方法内部不能直接访问类的非静态成员,因为非静态成员依赖于具体对象实例。

public class StaticDemo {
    // 静态变量
    public static int staticVar = 42;
    
    // 静态方法
    public static void staticMethod() {
        // 静态方法内部可以访问静态变量
        System.out.println(staticVar);
        
        // 静态方法内部不能直接访问非静态变量
        // 下面这行会导致编译错误
        // System.out.println(instanceVar);
    }
    
    // 非静态方法
    public void instanceMethod() {
        // 非静态方法可以访问静态和非静态变量
        System.out.println(staticVar);
        System.out.println(instanceVar);
    }
    
    public static void main(String[] args) {
        // 不需要创建对象,可以直接调用静态方法
        StaticDemo.staticMethod(); // 输出:42
        
        // 创建StaticDemo的实例
        StaticDemo obj = new StaticDemo();
        
        // 通过对象也可以调用静态方法,但通常不推荐这样做
        obj.staticMethod(); // 输出:42
        
        // 调用非静态方法需要创建对象
        obj.instanceMethod(); // 假设instanceMethod内部有输出语句
    }
}

三、练习

下面是一个简单的练习,用于加深对static关键字的理解。请创建一个Student类,包含静态变量totalStudents用于记录学生总数,以及非静态变量nameage用于存储学生姓名和年龄。编写一个静态方法enrollStudent用于新增学生并更新学生总数,以及一个非静态方法printInfo用于打印学生信息。

public class Student {
    // 静态变量,记录学生总数
    public static int totalStudents = 0;
    
    // 非静态变量,存储学生姓名和年龄
    public String name;
    public int age;
    
    // 构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        enrollStudent(); // 在创建对象时自动调用enrollStudent方法增加学生总数
    }
    
    // 静态方法,用于新增学生并更新学生总数
    public static void enrollStudent() {
        totalStudents++;
        System.out.println("一名新学生已入学,当前学生总数:" + totalStudents);
    }
    
    // 非静态方法,用于打印学生信息
    public void printInfo() {
        System.out.println("学生姓名:" + name);
        System.out.println("学生年龄:" + age);
    }
    
    public static void main(String[] args) {
        // 创建学生对象
        Student student1 = new Student("张三", 20); // 输出:一名新学生已入学,当前学生总数:1
        Student student2 = new Student("李四", 21); // 输出:一名新学生已入学,当前学生总数:2
        
        // 打印学生信息
        student1.printInfo(); // 输出:学生姓名:张三 学生年龄:20
        student2.printInfo(); // 输出:学生姓名:李四 学生年龄:21
        
        // 输出当前学生总数
        System.out.println("当前学生总数:" + Student.totalStudents); // 输出:当前学生总数:2
    }
}

在上面的代码中,totalStudents是一个静态变量,它用来记录学生的总数。每次创建Student对象时,enrollStudent静态方法会被调用,从而增加学生总数。nameage是非静态变量,它们分别用来存储每个学生的姓名和年龄。printInfo方法用于打印单个学生的信息。

通过这个练习,我们学会了如何定义和使用静态变量和静态方法,并理解了它们与非静态成员之间的区别。在实际开发中,静态成员通常用于存储与类本身相关而非与对象实例相关的数据或执行与类相关的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

文章目录 (十五)模型部署:ONNX和ONNX RuntimeONNX 和 ONNX Runtime的关系将PyTorch模型导出为ONNX格式使用Netron可视化ONNX模型图检查ONNX模型验证ONNX Runtime推理结果使用ONNX Runtime运行超分模型 (十五)模型部署&…

外贸干货|真正的销售高手,都很会提问

你的产品性价比很高,为什么客户没有买单呢? 最重要的原因是你没有了解到他真正的需求。 真正的销售高手,应该是一个提问高手,至少要连续问对方6个问题,问出客户的真实需求。 假如他回答你的问题,你有一种&a…

git 冲突与解决冲突

目录 1.使用 git 解决冲突 GIT 常用命令 制造冲突 解决冲突 2.使用 IDEA 解决冲突 产生冲突 解决冲突 1.使用 git 解决冲突 GIT 常用命令 命令作用git clone克隆git init初始化git add 文件名添加到暂存区git commit -m " 日志信息" 文件名提交到本地库git st…

【运维自动化-配置平台】如何通过模板创建集群和模块

通过【每天掌握一个功能点】配置平台如何创建业务机拓扑(集群-模块)我们知道了直接创建集群和模块的操作方法,直接创建的方式适合各集群模块都相对独立的场景,那大量的、标准规范的集群模块如何快速创建呢,这里就引入了…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展,生成对抗网络(GAN)作为其中的一个重要分支,在图像生成、图像修复等领域展现出了强大的能力。其中,条件生成对抗网络(cGAN)通过引入条件变量来控制生成模型的输出&am…

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

DiT论文精读Scalable Diffusion Models with Transformers CVPR2023

Scalable Diffusion Models with Transformers CVPR2023 Abstract idea 将UNet架构用Transformer代替。并且分析其可扩展性。 并且实验证明通过增加transformer的宽度和深度&#xff0c;有效降低FID 我们最大的DiT-XL/2模型在classconditional ImageNet 512、512和256、256基…

switch语句深讲

一。功能 1.选择&#xff0c;由case N:完成 2.switch语句本身没有分支功能&#xff0c;分支功能由break完成 二。注意 1.switch语句如果不加break&#xff0c;在一次判断成功后会执行下面全部语句并跳过判断 2.switch的参数必须是整形或者是计算结果为整形的表达式,浮点数会…

centos 7 yum install -y nagios

centos 7 systemctl disable firewalld --now vi /etc/selinux/config SELINUXdisabled yum install -y epel-release httpd nagios yum install -y httpd nagios systemctl enable httpd --now systemctl enable nagios --now 浏览器 IP/nagios 用户名&#xff1a;…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

Java-AQS的原理

文章目录 基本概述1. 设计思想2. 基本实现 一些关键词语以及常用术语&#xff0c;主要如下&#xff1a; 信号量(Semaphore): 是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用&#xff0c;也是作系统用来解决并发中的互斥和同步问题…

数据挖掘 | Count数据去除批次效应后不是整数甚至还出现负值导致无法进行差异分析怎么办?

之前咱们介绍过数据挖掘 | 批次效应的鉴定与处理 | 附完整代码 注释 | 看完不会来揍我&#xff0c;但是很多小伙伴遇到了Count数据批次处理后不是整数甚至还出现负值的问题&#xff0c;这就导致无法使用某些包包进行差异分析&#xff08;对差异分析感兴趣的小伙伴可以查看&…

MySQL中如何随机获取一条记录

点击上方蓝字关注我 随机获取一条记录是在数据库查询中常见的需求&#xff0c;特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中&#xff0c;有多种方法可以实现随机获取一条记录&#xff0c;每种方法都有其适用的情况和性能特点。在本文中&#xff0c;我们将探讨几种…

word添加行号

打开页面设置&#xff0c;找到行号

2018-2023年上市公司富时罗素ESG评分数据

2018-2023年上市公司富时罗素ESG评分数据 1、时间&#xff1a;2018-2023年 2、来源&#xff1a;整理自WIND 3、指标&#xff1a;证券代码、简称、ESG评分 4、范围&#xff1a;上市公司 5、指标解释&#xff1a; 富时罗素将公司绿色收入的界定和计算作为公司ESG 评级打分结…

「白嫖」开源的后果就是供应链攻击么?| 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 面对网络安全威胁日益严重的今天&#xff0c;软件供应链安全已经成为开发者领域无法避免的焦点…

OpenWRT设置自动获取IP,作为二级路由器

前言 上一期咱们讲了在OpenWRT设置PPPoE拨号的教程&#xff0c;在光猫桥接的模式下&#xff0c;OpenWRT如果不设置PPPoE拨号&#xff0c;就无法正常上网。 OpenWRT设置PPPoE拨号教程 但现在很多新装的宽带&#xff0c;宽带师傅为了方便都会把光猫设置为路由模式。如果你再外…
最新文章