【IT领域新生必看】深入了解Java中的静态成员变量和实例成员变量:初学者的全方位指南

news2025/2/24 9:29:55

文章目录

    • 引言
    • 什么是静态成员变量?
      • 定义和使用静态成员变量
        • 示例:
      • 静态成员变量的特点
        • 示例:
    • 什么是实例成员变量?
      • 定义和使用实例成员变量
        • 示例:
      • 实例成员变量的特点
        • 示例:
    • 静态成员变量与实例成员变量的区别
      • 作用范围
        • 示例:
      • 生命周期
        • 示例:
      • 内存位置
        • 示例:
      • 访问方式
        • 示例:
    • 实际应用示例
      • 示例1:计数器
        • 示例:
      • 示例2:用户信息
        • 示例:
    • 总结

在这里插入图片描述

引言

在Java编程中,变量是存储数据的基本单元。根据变量的定义位置和作用范围,Java中的变量可以分为静态成员变量和实例成员变量。理解这两种变量的区别和使用场景,是掌握Java编程的重要一步。本篇文章将详细介绍静态成员变量和实例成员变量的定义、用法及其区别,帮助你全面理解这些重要概念。

什么是静态成员变量?

静态成员变量,也称为类变量,是使用static关键字声明的变量。它属于整个类,而不是类的某个实例。这意味着静态成员变量在内存中只有一份,并且被该类的所有实例共享。

定义和使用静态成员变量

静态成员变量在类中定义,通常伴随着访问修饰符(如privateprotectedpublic)来控制其访问权限。

示例:
public class Counter {
    // 静态成员变量
    public static int count = 0;

    public Counter() {
        count++;
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();
        System.out.println("Count: " + Counter.count);  // 输出:Count: 3
    }
}

在上述示例中,count是一个静态成员变量,它随着每次创建Counter对象而递增。最终输出的count值是3,因为总共创建了三个实例。

静态成员变量的特点

  1. 共享性:静态成员变量在类加载时初始化,并在内存中只有一份,所有实例共享这份内存。
  2. 生命周期:静态成员变量的生命周期从类加载开始,到程序结束时结束。
  3. 访问方式:静态成员变量可以通过类名直接访问,也可以通过对象引用访问。
示例:
public class Example {
    // 静态成员变量
    public static int staticVar = 10;

    public static void main(String[] args) {
        System.out.println("Static Variable: " + Example.staticVar);  // 通过类名访问
        Example example = new Example();
        System.out.println("Static Variable: " + example.staticVar);  // 通过对象引用访问
    }
}

什么是实例成员变量?

实例成员变量,也称为对象变量,是在类中定义但没有使用static关键字修饰的变量。它属于类的每个实例,每个实例都有自己独立的实例成员变量。

定义和使用实例成员变量

实例成员变量在类中定义,通常伴随着访问修饰符(如privateprotectedpublic)来控制其访问权限。

示例:
public class Dog {
    // 实例成员变量
    private String name;

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

    public void bark() {
        System.out.println(name + " is barking");
    }

    public static void main(String[] args) {
        Dog dog1 = new Dog("Buddy");
        Dog dog2 = new Dog("Max");
        dog1.bark();  // 输出:Buddy is barking
        dog2.bark();  // 输出:Max is barking
    }
}

在上述示例中,name是一个实例成员变量,每个Dog对象都有自己独立的name变量。

实例成员变量的特点

  1. 独立性:每个实例都有自己独立的实例成员变量,互不影响。
  2. 生命周期:实例成员变量的生命周期从对象创建开始,到对象被垃圾回收时结束。
  3. 访问方式:实例成员变量只能通过对象引用访问,不能通过类名访问。
示例:
public class Example {
    // 实例成员变量
    public int instanceVar = 20;

    public static void main(String[] args) {
        Example example = new Example();
        System.out.println("Instance Variable: " + example.instanceVar);  // 通过对象引用访问
        // System.out.println("Instance Variable: " + Example.instanceVar);  // 编译错误,不能通过类名访问
    }
}

静态成员变量与实例成员变量的区别

作用范围

  • 静态成员变量:作用于整个类,所有实例共享。
  • 实例成员变量:作用于类的每个实例,各实例独立。
示例:
public class Comparison {
    // 静态成员变量
    public static int staticVar = 0;
    // 实例成员变量
    public int instanceVar = 0;

    public Comparison() {
        staticVar++;
        instanceVar++;
    }

    public static void main(String[] args) {
        Comparison c1 = new Comparison();
        Comparison c2 = new Comparison();
        Comparison c3 = new Comparison();

        System.out.println("Static Variable: " + Comparison.staticVar);  // 输出:Static Variable: 3
        System.out.println("Instance Variable c1: " + c1.instanceVar);  // 输出:Instance Variable c1: 1
        System.out.println("Instance Variable c2: " + c2.instanceVar);  // 输出:Instance Variable c2: 1
        System.out.println("Instance Variable c3: " + c3.instanceVar);  // 输出:Instance Variable c3: 1
    }
}

生命周期

  • 静态成员变量:在类加载时初始化,程序结束时销毁。
  • 实例成员变量:在对象创建时初始化,对象被垃圾回收时销毁。
示例:
public class Lifecycle {
    // 静态成员变量
    public static int staticVar;

    // 实例成员变量
    public int instanceVar;

    static {
        staticVar = 10;
        System.out.println("Static Variable Initialized: " + staticVar);
    }

    public Lifecycle() {
        instanceVar = 20;
        System.out.println("Instance Variable Initialized: " + instanceVar);
    }

    public static void main(String[] args) {
        Lifecycle obj1 = new Lifecycle();
        Lifecycle obj2 = new Lifecycle();
    }
}

内存位置

  • 静态成员变量:存储在方法区的静态存储区。
  • 实例成员变量:存储在堆内存中,每个对象的实例成员变量独立存储。
示例:
public class Memory {
    // 静态成员变量
    public static int staticVar = 10;

    // 实例成员变量
    public int instanceVar;

    public Memory(int value) {
        this.instanceVar = value;
    }

    public static void main(String[] args) {
        Memory obj1 = new Memory(20);
        Memory obj2 = new Memory(30);

        System.out.println("Static Variable: " + Memory.staticVar);  // 输出:Static Variable: 10
        System.out.println("Instance Variable obj1: " + obj1.instanceVar);  // 输出:Instance Variable obj1: 20
        System.out.println("Instance Variable obj2: " + obj2.instanceVar);  // 输出:Instance Variable obj2: 30
    }
}

访问方式

  • 静态成员变量:可以通过类名访问,也可以通过对象引用访问。
  • 实例成员变量:只能通过对象引用访问,不能通过类名访问。
示例:
public class Access {
    // 静态成员变量
    public static int staticVar = 100;

    // 实例成员变量
    public int instanceVar;

    public Access(int value) {
        this.instanceVar = value;
    }

    public static void main(String[] args) {
        Access obj = new Access(200);

        // 通过类名访问静态成员变量
        System.out.println("Static Variable (class): " + Access.staticVar);  // 输出:Static Variable (class): 100
        // 通过对象引用访问静态成员变量
        System.out.println("Static Variable (object): " + obj.staticVar);  // 输出:Static Variable (object): 100
        // 通过对象引用访问实例成员变量
        System.out.println("Instance Variable: " + obj.instanceVar);  // 输出:Instance Variable: 200
    }
}

实际应用示例

示例1:计数器

静态成员变量可以用于实现全局计数器,统计某个类的实例数量。

示例:
public class Counter {
    // 静态成员变量
    private static int count = 0;

    public Counter() {
        count++;
    }

    public static int getCount() {
        return count;
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();
        System.out.println("Number of instances: " + Counter.getCount());  // 输出:Number of instances: 3
    }
}

示例2:用户信息

实例成员变量可以用于存储每个对象独立的属性,例如用户信息。

示例:
public class User {
    // 实例成员变量
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void display() {
        System.out.println("Name: " + name + ", Age: " + age);
    }

    public static void main(String[] args) {
        User user1 = new User("Alice", 25);
        User user2 = new User("Bob", 30);
        user1.display();  // 输出:Name: Alice, Age: 25
        user2.display();  // 输出:Name: Bob, Age: 30
    }
}

总结

静态成员变量和实例成员变量是Java编程中两个重要的变量类型,它们在作用范围、生命周期、内存位置和访问方式等方面存在显著区别。通过本文的介绍,你应该对静态成员变量与实例成员变量的定义、用法及其区别有了全面的了解。希望你在编程的学习过程中不断进步,成为一名出色的程序员!

无论你是在定义类的全局状态,还是存储对象的独立属性,记住合理选择静态成员变量或实例成员变量,遵循最佳实践,这将使你的代码更加高效、可读和可维护。祝你编程愉快!

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

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

相关文章

lodash-es 基本使用

中文文档:https://www.lodashjs.com/ cloneDeep方法文档:https://www.lodashjs.com/docs/lodash.cloneDeep#_clonedeepvalue 参考掘金文章:https://juejin.cn/post/7354940462061715497 安装: pnpm install lodash-esnpm地址&a…

关于用户咨询华为擎云L410笔记本安装Windows系统的说明

同样也是单位购买的华为擎云L410 KLVU-WDU0笔记本电脑,国产UOS系统某些软件用着不是很方便,用户咨询是否能够安装Windows10或者Windows7? 带着种种疑问也做了一些查询,之前也给一些国产设备更改过操作系统,之前的国产设…

G9 - ACGAN理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 环境步骤环境设置数据准备工具方法模型设计模型训练模型效果展示 总结与心得体会 上周已经简单的了解了ACGAN的原理,并且不经实践的编写了部分…

git pull拉取显示Already up-to-date,但文件并没有更新

1、问题: 使用git pull拉取远程仓库代码,显示更新成功(Already up-to-date),但是本地代码没有更新 这是因为本地有尚未提交的更改,和远程代码有冲突导致无法更新 2、解决方法: 可以使用git s…

MySQL架构和工作流程

引言:MySQL执行一条sql语句期间发生了什么? 想要搞清楚这个问题,我们必须了解MySQL的体系结构和工作流程 一、MySQL体系结构 MySQL由以下几个部分组成 一、server层 1.MySQL Connnectors连接器,MySQL的连接池组件,…

BlazorHybrid 通过Blazor简单调用本机功能

简单调用本机功能,例如打印,获取硬件信息,获取本机用户名,拦截JS功能,拦截错误信息等等… 废话不多说先来截图 使用 JsBridge JsBridge不科普了,同学们自行百度一下 BlazorWebView.cs using Microsoft.AspNetCore.Components.WebView; using Microsoft.AspNetCore.Componen…

easyx图形库

目录 1、绘制简单的图形化窗口 2、设置窗口属性 2.1 颜色设置 2.2 刷新 3、基本绘图函数 3.1 绘制直线 3.2 绘制圆 3.3 绘制矩形 4、贴图 4.1 原样贴图 4.1.1 IMAGE变量去表示图片 4.1.2 加载图片 4.1.3 显示图片 4.2 透明贴图 4.2.1 认识素材 4.3 png贴图 5…

辣子简报芬芳喜事特辑

【辣子简报芬芳喜事特辑】🎉在这个季节的尾声,当一缕阳光温柔地洒在打包好的行囊上,我们不约而同地停下了忙碌的脚步,回望那段共同编织的璀璨时光——79天的并肩作战,如同一段精彩绝伦的旅程,如今已缓缓驶向…

taoCMS v3.0.2 任意文件读取漏洞(CVE-2022-23316)

前言 CVE-2022-23316 是一个影响 taoCMS v3.0.2 的漏洞。这个漏洞允许攻击者通过 admin.php?actionfile&ctrldownload&path../../1.txt 的路径读取任意文件。攻击者可以利用该漏洞读取服务器上的任何文件,只要他们知道文件的路径​ (OpenCVE)​​ (Tenabl…

Java多语言跨境电商外贸商城源码 tiktok商城系统源码 跨境电商源码

Java多语言跨境电商外贸商城源码 tiktok商城系统源码 跨境电商源码 技术栈 PC端使用:vueelementui 用户端使用:uniapp 管理端使用:vueelementui 后台服务使用:springbootmybatisplusmysql 功能描述: 对接PayPal…

IDEA配Git

目录 前言 1.创建Git仓库,获得可提交渠道 2.选择本地提交的项目名 3.配置远程仓库的地址 4.新增远程仓库地址 5.开始进行commit操作 6.push由于邮箱问题被拒绝的解决方法: 后记 前言 以下操作都是基于你已经下载了Git的前提下进行的&#xff0c…

源码航行阅读目录

🏀 前言 在准备面试和学习的过程中,我阅读了比较多的源码,比如 JUC、Spring、MyBatis,收获了很多代码的设计思想,也对平时调用的 API 有了更深入的理解;但过多散乱的笔记给我的整理复习带来了比较大的麻烦…

前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架&#xff0c;后台只需一个工具类即可实现下载 后端下载实现 依赖 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…

第三方商城对接重构(HF202407)

文章目录 项目背景一、模块范围二、问题方案1. 商品模块整体来说这块对接的不是太顺利,梳理了几条大概的思路:2. 订单模块3. 售后4. 发票5. 结算单经验总结项目背景 作为供应商入围第三方商城成功,然后运营了一段时间,第三方通知要重构, 需要重新对接打通接口完成系统对接…

树型结构数据存储实践

很多业务场景会遇到树形结构的数据&#xff0c;如公司的人员职级树、行政区划树等。 使用类似MySQL的数据库进行存储&#xff0c;需要将树形结构&#xff08;二维&#xff09;存储到行格式&#xff08;一维&#xff09;的db中。 本文介绍了树型结构数据存储的三种方式&#xf…

ShardingSphere实战

ShardingSphere实战 文章目录 ShardingSphere实战分库分表实战建表建表sql利用存储过程建表Sharding-jdbc分库分表配置 基于业务的Sharding-key考虑订单id用户id分片策略订单id的设计与实现**设计思想**&#xff1a;设计思路&#xff1a; 具体分片策略实现测试数据插入商户商品…

计算机提示由于找不到concrt140.dll怎么办,7种解决方法可以对比

在电脑中打开游戏或许软件出现找不到concrt140.dll无法继续执行代码怎么办&#xff1f;concrt140.dll是什么&#xff1f;丢失要怎么解决&#xff1f;下面给大家分析一下concrt140.dll文件是什么与concrt140.dll丢失的多种解决方法&#xff01;相信对你有帮助&#xff01; 一、c…

SpringSecurity6.x使用教程

SpringSecurity6.x使用 SpringSecurity版本 SpringSecurity目前支持的版本如下图所示&#xff0c;可以看到5.x的版本过几年就不会再维护了&#xff0c;6.x将成为主流。 入门 引入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…

法国工程师IMT联盟 密码学及其应用 2022年期末考试

1 密码学 1.1 问题1 对称加密&#xff08;密钥加密) 1.1.1 问题 对称密钥la cryptographie symtrique和公开密钥有哪些优缺点&#xff1f; 1.1.1.1 对称加密&#xff08;密钥加密)的优缺点 1.1.1.1.1 优点 加解密速度快encrypt and decrypt&#xff1a;对称加密算法通常基于…

智能家居安防系统教学解决方案

前言 随着科技的不断进步和智能家居概念的深入人心&#xff0c;智能家居安防系统作为智能家居领域的重要组成部分&#xff0c;其重要性日益凸显。智能家居安防系统不仅能够提供环境和人员的监测功能&#xff0c;还能够采取措施降低或避免人员伤亡及财产损失。因此&#xff0c;…