详解Java的static关键字

文章目录

  • 🎄静态方法
  • 🌺静态方法和非静态方法对比
    • 🛸静态方法实例
    • 🛸非静态方法实例
  • 🌹static关键字
    • ⭐static变量
    • ⭐static代码块

在这里插入图片描述

🎄静态方法

  • 不依赖于对象实例:静态方法不需要依赖于任何对象实例,因为它们与具体的对象实例无关联。这意味着在没有创建对象实例的情况下,就可以直接通过类名访问或调用静态方法。
  • 可以访问静态成员:静态方法可以访问类的静态成员(静态字段和静态方法),但不能访问非静态成员(实例字段和实例方法)。这是因为静态方法在被调用时,可能还没有任何对象实例被创建,因此无法访问依赖于对象实例的非静态成员。
  • 类级别的操作:静态方法通常用于表示类级别的操作,例如工具方法、单例模式、工厂方法等。这些操作不依赖于具体的对象实例,而是与整个类相关联。
  • 语法结构:静态方法使用static关键字修饰,并且位于类中的任意位置。它可以通过类名直接访问或调用,而不需要创建对象实例。

🌺静态方法和非静态方法对比

🛸静态方法实例

public class MyClass {
    private static int count = 0;

    public static void increment() {
        count++;
    }

    public static int getCount() {
        return count;
    }

    // 其他成员和方法...
}

在上面的示例中,我们定义了一个静态方法increment()和一个静态字段count,用于表示某个类的实例数量。静态方法increment()每次被调用时,会将count加1;静态方法getCount()用于获取当前count的值。注意,这两个方法都是静态方法,可以通过类名直接访问或调用,例如MyClass.increment()和MyClass.getCount()

总之,静态方法不依赖于任何对象实例就能进行访问,因为它们与具体的对象实例无关联,而是与整个类相关联。静态方法在内存中只有一份副本,并且在类加载时初始化,因此可以直接通过类名访问或调用。

🛸非静态方法实例

public class MyClass {
    private int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }

    // 其他成员和方法...
}

在上面的示例中,我们定义了一个非静态方法increment()和一个非静态字段count,用于表示某个对象实例的数量。非静态方法increment()每次被调用时,会将当前对象实例的count加1;非静态方法getCount()用于获取当前对象实例的count值。注意,这两个方法都是非静态方法,必须通过对象实例来访问或调用,例如obj.increment()和this.getCount()

总之,非静态方法必须要依赖于对象实例才能进行访问,因为它们与具体的对象实例相关联,并且需要访问依赖于对象实例的实例成员。

🌹static关键字

static方法一般称为静态方法,由于静态方法不依赖于任何对象就能进行访问,因此对于静态方法来说,是没有this关键字的(因为静态方法不依赖于任何对象,既然没有对象,就谈不上this了

为什么静态方法不依赖于任何对象就能进行访问

静态方法不依赖于任何对象就能进行访问,是因为它们与具体的对象实例无关联,而是与整个类相关联(请看上面讲述静态方法实例的代码)。静态方法在内存中只有一份副本,并且在类加载时初始化,因此可以直接通过类名访问或调用。


虽然静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员变量和方法的
我们最常用的static方法就是main方法,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问

⭐static变量

static变量又称为静态变量,静态变量和非静态变量的全部是
静态变量:被所有的对象所共享,在内存中只有一个副本
非静态变量:是对象所拥有的,在创建对象的过程在被初始化,存在多个副本,各个对象拥有的副本之间互不影响
使用static修饰成员方法最大的作用,就是可以通过类名.方法名的方式调用方法,避免了new出对象的繁琐和资源消耗

⭐static代码块

静态代码块(static code block)是使用static关键字定义的一种特殊代码块,在类加载时执行,并且仅执行一次,通过静态代码块,我们可以在类加载时完成一些必要的初始化工作,确保类的静态成员在后续的使用中具备正确的状态

静态代码块的主要特点如下:

  • 执行时机:静态代码块在类加载过程中被执行,而不是在创建对象实例时执行。它会在类首次被加载时自动执行,并且只执行一次。一般情况下,静态代码块在类加载时的准备阶段执行。
  • 作用范围:静态代码块属于整个类,与具体的对象实例无关。它可以用于初始化静态成员(静态字段)或执行其他一次性的静态操作。
  • 访问权限:静态代码块可以访问类中的静态成员(静态字段、静态方法等),但无法直接访问非静态成员(实例字段、实例方法等),因为非静态成员需要依赖具体的对象实例才能访问。
  • 语法结构:静态代码块使用static关键字修饰,并且位于类中的任意位置,通常紧跟在静态字段的定义之后。它使用一对大括号{}包裹起来,内部可以包含任意的Java代码。

以下是一个静态代码块的示例:

public class MyClass {
    static {
        // 静态代码块中的代码
        System.out.println("Static block executed.");
    }

    // 其他成员和方法...
}

在上面的示例中,当MyClass类被加载时,静态代码块会被执行,并输出"Static block executed."。注意,静态代码块只会执行一次,即使创建多个MyClass对象实例。

静态代码块常用于初始化静态字段或执行其他一次性的静态操作,例如加载配置文件、初始化数据库连接等。它在类加载时自动执行,确保了静态成员的初始化在使用之前完成。

总之,静态代码块是使用static关键字定义的一种特殊代码块,在类加载时执行,并且仅执行一次。它可以用于初始化静态成员或执行其他一次性的静态操作,通常位于类中的任意位置,紧跟在静态字段的定义之后。

希望本文能够为您带来新的思考和启发,也期待与您共同分享更多关于(文章主题)的想法。让我们携手并肩,共同创造美好的未来!

在这里插入图片描述

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

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

相关文章

香港高端人才通行证计划申请(包括条件)你需要知道的这些真相!

香港高端人才通行证计划申请(包括条件)你需要知道的这些真相! 香港高才通计划从刚推出就带着“光速获批“的光环,吸引了大批高学历和高收入人士,后续也因它申请要求简单、明确,获批率高等优势,火…

飞桨——总结PPOCRLabel中遇到的坑

操作系统:win10 python环境:python3.9 paddleocr项目版本:2.7 1.报错:ModuleNotFoundError: No module named Polygon(已解决) 已解决所以没有复现报错内容 尝试方法一:直接使用pip命令安装&…

rook-ceph部署

rook是云原生存储编排器,本身不提供存储。 下载 git clone --single-branch --branch v1.11.4 https://github.com/rook/rook.git cd rook/deploy/examples 修改镜像地址images.txt operator方式部署rook kubectl apply -f crds.yaml -f common.yaml -f operator…

java实现置顶功能

目录 一、需求描述 二、功能呈现 (一)需求分析 (二)关键设计披露 1、数据库字段 2、查询语句 一、需求描述 在查看公司列表数据时,我想最先看到我常用的公司。 也就是,我想把这个公司放在最前面&am…

【Windows 常用工具系列 13 -- Confluence 如何快速输入代码块 code block】

文章目录 Confluence 如何快速输入代码块方法二 Confluence 如何快速输入代码块 在使用使用 confluence 进行文档编辑时,有时需要贴上部分代码,但是直接贴代码在 confluence上,显示效果不是太好看,所以confluence 给我们提供了符…

DolphinDB 浙商银行 | 第二期现场培训圆满结束

自 DolphinDB 高级工程师计划开展以来,客户们纷纷响应,除了定期收看我们每周三开设的线上公开课外,也有部分客户报名参加了 “总部工程师培训计划” 。 上周,我们迎来了总部培训的第二期学员:来自浙商银行的4位策略研…

【qsort学习及改造冒泡排序能排序任何数】

qsort学习及改造冒泡排序能排序任何数 qsort的使用 qsort的使用 这个函数也不是很复杂!!! qsort(void*base,size_t num,size_t width,int(int (__cdecl *compare )(const void *elem1, const void *elem2 )))  void * base,为数组的基地…

cocos2dx ​​Animate3D (一)

3D相关的动画都是继承Grid3DAction 本质上是用GirdBase进行创建动画的小块。 Shaky3D 晃动特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 晃动的范围 // z轴是否晃动 static Shaky3D* create(float initWithDuration, const Size& …

计数排序+桶排序+基数排序 详讲(思路+图解+代码详解)

文章目录 计数排序桶排序基数排序一、计数排序概念:写法一:写法二: 二、桶排序概念代码 三、基数排序概念1.LSD排序法(最低位优先法)2.MSD排序法(最高位优先法) 基数排序VS基数排序VS桶排序 计数…

Linux:进度条(小程序)以及git三板斧

Linux小程序&#xff1a;进度条 在实现小程序前我们要弄清楚&#xff1a; 1.缓冲区&#xff1b; 2.回车与换行。 缓冲区&#xff1a; 分别用gcc来编译下面两个程序&#xff1a; 程序一&#xff1a; #include <stdio.h> int main() { printf("hello Makefil…

剧情继续:马斯克曝出OpenAI前员工举报信,董事会与奥特曼谈判回归

丰色 发自 凹非寺 量子位 | 公众号QbitAI 经过4天的极限拉扯、反转再反转&#xff0c;奥特曼有可能重新回归了。 据知情人士透露&#xff0c;OpenAI董事会正与奥特曼进行一场“富有成效”的新谈判。 如果奥特曼回到OpenAI&#xff0c;他将继续担任CEO。 与此同时&#xff0c…

【MybatisPlus】简介与使用

MyBatisPlus 1.简介 MyBatisPlus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生 官网&#xff1a;https://baomidou.com/ MyBatis-Plus特性&#xff1a; 无侵入&#xff1a;只…

一文深入理解Linux进程间通信

一、进程间通信的本质 什么是进程间通信&#xff1f;为什么要有进程间通信&#xff1f; 为什么能进程间通信&#xff1f; 1.1 为什么要通信 我们先拿人来做个类比&#xff0c;人与人之间为什么要通信&#xff0c;有两个原因。首先是因为你有和对方沟通的需求&#xff0c;如…

常用的工作资料怎么在电脑上记录呢?

在现代工作中&#xff0c;我们经常需要记录各种各样的工作资料&#xff0c;例如会议记录、项目计划、待办事项等等。传统的纸质笔记本虽然方便携带&#xff0c;但难以整理和检索。而在电脑上直接记录常用的工作资料&#xff0c;在记录、整理、查看、使用等方面都是更为高效、便…

什么是搜索相关性?AI如何驱动搜索相关性?

训练数据驱动机器学习&#xff0c;机器学习促进丰富的人机交互体验。在快速迭代的互联网时代&#xff0c;我们不断被各种广告铺盖&#xff0c;甚至经常细思极恐&#xff0c;“天呐&#xff0c;小红书怎么知道我面膜没了。”这都是算法和机器学习的鬼斧神工洞察着用户的搜索意图…

使用Microsoft Dynamics AX 2012 - 4. 销售和配送

销售和分销的主要职责是为客户提供您的商品和服务。为了完成这项任务&#xff0c;销售和分销需要通过分拣、运输和开具发票来处理销售订单&#xff0c;从而管理客户的材料需求。 销售和配送业务流程 在我们开始详细介绍之前&#xff0c;下面几行概述了销售和配送中的业务流程…

Imaris 卡退,是不是缓存盘没有设置好?

必须记录一下&#xff0c;从Imaris哔哩哔哩官方视频上学到的&#xff0c;如何设置缓存位置&#xff0c;尤其是做3D视频的时候。 但是隔一段时间就忘记&#xff0c;找不到当时的哔哩哔哩视频 这里记一下 如果是空间比较小的C盘&#xff0c;可以改成一个空间大一点的位置。 把缓…

vue3.0 + qiankun遇到的问题

进入子应用再回到主应用切换动态路由时 TypeError: Cannot read properties of undefined (reading ‘appWrapperGetter’) application ‘plat’ died in status UNMOUNTING: instance.$destroy is not a function 第一个报错是因为子应用切走时没有销毁 vue的实例&#xff0…

React中封装echarts图表组件以及自适应窗口变化

文章目录 前言环境代码接口使用效果后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;…

自动化脚本不稳定,原来是软件弹窗惹的祸,2个方法解决!

很多同学在学习 App 自动化或者在项目中落地实践 App 自动化时&#xff0c;会发现编写的自动化脚本无缘无故的执行失败、不稳定。 而导致其问题很大原因是因为应用的各种弹窗&#xff08;升级弹窗、使用过程提示弹窗、评价弹窗等等&#xff09;&#xff0c;比如这样的&#xff…