Java Static关键字详解

深入CRSF协议数据包:手撕STM32代码,教你像调试串口一样分析ELRS遥控数据流 本文深入解析CRSF协议数据包,通过手撕STM32代码,教你如何像调试串口一样分析ELRS遥控数据流。从硬件准备到数据包捕获状态机设计,再到高级数据分析技巧和实战应用,全面覆盖CRSF协议的解析与优化,帮助开发者构建稳定可靠的通信系统。 阅读详情

提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的,但是像这样的基础不牢的人应该不少,因为常用,所以用大家都会,但是谈到精细之处都够呛。这篇博客是我翻出我原来的学习笔记再加上自己看的一些博客整理出来的,供基础知识不怎么牢靠的同学参考参考。

1. static 关键字要解决的问题

  这里摘录一下《Java编程思想(第四版)》里关于static关键字的一段原话:(P29)通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个对象,否则,实际上并未获得任何对象。执行new来创建对象的时候,数据存储空间才被分配,其方法才供外界调用。有两种情形用上述方法是无法解决的。一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少个对象,甚至根本不需要创建任何对象。另一种情形是,希望某个方法不与包含他的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用方法。简单来说,static的主要目的就是创建独立于具体对象的域变量与方法。

2. static修饰的变量或方法或类的加载时机

  在加载类的同时加在static修饰的部分。(注意:这个时候,还不存在具体对象,并且这个过程只进行一次)

3. 通过代码示例来分别看看静态变量、静态方法、静态类的效果

3.1 静态变量

复制代码
public class StaticTest{

    public static int count =0;
    
    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StaticTest test1 = new StaticTest();
        System.out.println(test1.count);
        StaticTest test2 = new StaticTest();
        test2.count++;
        System.out.println(test1.count+" "+test2.count+" "+StaticTest.count);
    }

}
复制代码

输出结果:

0
1    1    1

可见,static变量并不是所在类的某个具体对象所有,而是该类的所有对象所共有的,静态变量既能被对象调用,也能直接拿类来调用。

除此之外,静态变量不能引用非静态方法,原因正如前面描述静态加载时机中说的那样,加载静态的时候,非静态的变量、方法等还不存在,当然就无法引用了。但是,非静态方法或类却能正常引用静态变量或方法。因为非静态总是在静态之后出现的。

3.2 静态方法

  静态方法和静态变量一样,属于类所有,在类加载的同时执行,不属于某个具体的对象,所有对象均能调用。对于静态方法需要注意以下几点:

  • 它们仅能调用其他的static 方法。
  • 它们只能访问static数据。
  • 它们不能以任何方式引用this 或super。
复制代码
class Simple {
    static void go() {
       System.out.println("Welcome");
    }
}
 
public class Cal {
    public static void main(String[] args) {
       Simple.go();
    }
}
复制代码

 

  静态方法一般用于工具类中,可以直接拿类名调用工具方法进行使用。

3.3 静态类

  一般来说,一个普通类是不允许被声明为static的,但是,在内部类中可以将其声明为static的,这个时候,外部类可以直接调用内部类,因为static的内部类是在加载外部类的同时加载的,所以也就是说,并不要实例化外部类就能直接调用静态内部类。看例子:

复制代码
public class BaseStatic {
  static {
        System.out.println("Load base static");
    }

    public BaseStatic(){
        System.out.println("BaseStatic constructor");
    }
    
    static class BaseInnerClass{
        static{
            System.out.println("Base inner class static");
        }
        
        public BaseInnerClass(){
            System.out.println("BaseInnerClass constructor");
        }
    }

}


public class StaticLoadOrderTest{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new BaseStatic.BaseInnerClass();
    }

}
复制代码

在看答案之前,自己想想这个输出结果是什么?

先不急着看答案,我们先来看看这个执行过程:首先,在进入StaticLoadOrderTest的main方法之前,加载StaticLoadOrderTest类,然后执行new BaseStatic.BaseInnerClass();这里需要注意:因为BaseInnerClass是静态的,所以这里并不需要加载外部类和实例化外部类,可以直接加载BaseInnerClass并实例化。所以输出:

 Base inner class static
BaseInnerClass constructor

这里留个坑:当直接使用外部类类名.静态内部类进行实例化的时候,如果外部类没有加载的话(实际上也是没有加载),那么这个statement: BaseStatic.BaseInnerClass中的BaseStatic是个什么存在????难道只是与静态内部类发生了简单的名称关联吗?若是这样还设计静态内部类干嘛呢?我觉得java设计者们不至于犯这种错误吧?也可能因为自己对于JVM并不熟悉,对于底层不太了解,若是路过的大神能帮忙解决一下,感激不尽!!!!

3.4 关于静态加载顺序的示例

下面这段代码的输出是什么?

复制代码
public class BaseStatic {
    static {
        System.out.println("Load base static");
    }
    
    public BaseStatic(){
        System.out.println("BaseStatic constructor");
    }
    
    static class BaseInnerClass{
        static{
            System.out.println("Base inner class static");
        }
        
        public BaseInnerClass(){
            System.out.println("BaseInnerClass constructor");
        }
    }

}

public class StaticLoadOrderTest {
    
    static {
        System.out.println("Load test");
    }
    
    public StaticLoadOrderTest(){
        System.out.println("Test constructor");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new BaseStatic();
        new StaticLoadOrderTest();
        new BaseStatic.BaseInnerClass();
    }

}
复制代码

  和上面一样,分析一下过程:在进入main方法之前,需要加载StaticLoadOrderTest类,这时候发现有static代码块,先加载静态代码块,然后进入main方法内部,new BaseStatic(),这时候需要加载BaseStatic类,同时也要先加载静态代码块,然后调用构造器。注意:这里并没有加载BaseInnerClass,因为它是内部类只有在真正用到的时候才会进行加载,相信聪明的读者看到这个是不是想到了又一种单例设计模式的实现方式?自己研究吧。回到main方法中,接下来该执行new StaticLoadOrderTest()了,因为StaticLoadOrderTest类之前已经被加载过一次了,并且类只加载一次,所以这里就直接构造了;然后是最后一句new BaseStatic.BaseInnerClass()了,和上面例子一样,这里就不再细讲。所以输出结果为:

Load test
Load base static
BaseStatic constructor
Test constructor
Base inner class static
BaseInnerClass constructor

  再考虑一下,如果我把上面的例子改成下面这样,输出结果又会是什么呢?

复制代码
public class BaseStatic {
    static {
        System.out.println("Load base static");
    }
    
    public BaseStatic(){
        System.out.println("BaseStatic constructor");
    }
    
    static class BaseInnerClass{
        static{
            System.out.println("Base inner class static");
        }
        
        public BaseInnerClass(){
            System.out.println("BaseInnerClass constructor");
        }
    }

}



public class StaticLoadOrderTest extends BaseStatic{
    
    static {
        System.out.println("Load test");
    }
    
    public StaticLoadOrderTest(){
        System.out.println("Test constructor");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new BaseStatic.BaseInnerClass();new StaticLoadOrderTest(); 
new BaseStatic();
} }
复制代码

 

以上就是关于java中static关键字的一些知识了。

【论文复现】——基于欧式聚类的车载点云道路提取 针对车载激光点云道路信息提取的问题,提出了一种基于欧式聚类的道路提取方法。首先通过统计滤波去除噪点以免对后续处理结果产生影响,然后用坡度滤波去除路坎点,使道路边界与人行道、绿化带等与路坎相连的地物形成10~25 cm的高程阶跃,最后用欧式聚类将路面点云与其他地物点云聚类为一簇或多簇并保留道路簇,从而实现道路点云的精确提取。 阅读详情

相关推荐

基于Open Cluster Management构建企业级多Kubernetes集群管理平台OpenClaw

在云原生架构中,Kubernetes已成为容器编排的事实标准。随着业务规模扩大,企业往往需要管理分布在多个云环境或数据中心的Kubernetes集群,这带来了集群管理、应用分发、策略统一和监控运维等复杂挑战。多集群管理技术通过提供统一控制平面,实现了对分布式资源的集中管控,其核心价值在于提升运维效率、保障安全合规并降低管理成本。Open Cluster Management(OCM)作为CNCF沙箱项目,采用Kubernetes原生架构,通过自定义资源定义(CRD)和控制器模式,为构建多集群管理平台提供了标

weixin_33747129的博客 368

java static 详解

1、static目的 java中的static关键字主要用于内存管理。 2、static范围 使用范围:java static关键字可以用在变量、方法、代码块和嵌套类伤。 作用范围:static关键字属于类,而不是类的实例。 静态(static)修饰如下: 变量:称为类变量、静态变量 方法:称为类方法、静态方法 代码块:称为静态代码块 嵌套类:称为静态内部类 3、静态变量 类的成员变量可以分为以下两种: 静态变量(或称为类变量),指被 static 修饰的成员变量。 实例变量,指没.

春风化雨 6万+

实验室LIMS系统选型指南:从赛默飞到金现代,5大主流方案横评

本文深入分析了实验室LIMS系统选型的5大核心维度,包括架构选择、行业适配性、合规性设计、智能化程度和成本模型。通过对比赛默飞、金现代等主流厂商的优劣势,提供实战避坑策略,帮助实验室管理者做出明智决策,提升运营效率和合规水平。

plum99的博客 259

java中static关键字的使用说明

1、static关键字的用途  在《Java编程思想》P86页有这样一段话:   “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”   这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简...

奋斗的哼哼 3万+

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

2026年7月19日 从可插拔到共封装:技术路线研究报告

AI 算力的爆发正在重写数据中心光互连的技术路线。本报告对当前并存的四代光互连架构——

weixin_51184047的博客 591

面向对象进阶--static关键字及应用,继承的概念知识点

面向对象进阶--static关键字及应用,继承的概念知识点

两点 1255

重磅!AI实时读取总结微信聊天记录,附MCP协议+智能体配置教程!

【摘要】本文介绍了一套AI实时分析微信聊天记录的解决方案,通过Chatlog+Trae+MCP协议实现智能整理群聊信息。Chatlog作为开源工具本地解析微信数据,确保隐私安全;Trae提供AI分析能力,支持自然语言处理。操作步骤包括:1)下载运行Chatlog并启动HTTP服务;2)安装Trae配置MCP协议;3)创建智能体设置提示词。该方案虽需初始配置,但能有效解决群聊信息过载问题,自动提炼关键内容,避免有价值信息被淹没。文中提供了详细教程链接和网盘资源。

puyihuan的博客 1万+

理解Java中的static关键字

Static 关键字 在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。 特点 它为该类的公用变量,属于类,对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享,在类被载入时被显式初始化。 可以使用“对象.类属性”来调用。不过,一般都是用“类名.类属性”。 Static变量置于方法区中! 用static声明的方法为静态方法,不需要对象,就可以调用(...

weixin_45797022的博客 2490

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 314

PCL学习笔记(四)——点云曲面重建

文章目录一、凸包算法二、 单纯的点云数据固然很好,但仅仅是点的话仍是不够的,因为这不利于我们后续对实体对象的渲染与各种应用,如计算实体的表面积、体积等等,所以这就需要我们对实体进行点云的曲面重建。 一、凸包算法 在计算机图形学中,凸包是指在任意维空间中包含某一有限点集P的最小凸集,它由凸包顶点构成,在二维上其表现形式为一个凸多边形,而在三维上则表现为一个凸多面体。在二维层面上来讲,最常用的凸包算法有Graham扫描法和Jarvis卷包裹法,但前者并不适用于三维层面,后者倒是可以扩展到三维。除此之外,在

dayuhaitang1的博客 6912

Java中【static关键子--静态变量,静态方法,原理图解】简单介绍

1.static关键字 1.1概述  关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了 1.2 定义和使用格式  当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。 静态变量 类变量:使用 static关键字修饰的成员变量。 定义格式: static 数据类型

qq_43436117的博客 1652

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

Java static关键字详解

static关键字 在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。 这里要强调一下: static修饰的成员变量和方法,从属于类 普通变量和方法从属于对象 静态方法不能调用非静态成员,编译会报错 static关键字的用途 一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。 显然,被sta...

测试极客 15万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【JAVA进阶】static关键字详解

开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。由于工具里面都是静态方法,直接用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器进行私有。特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行。代码块是类的5大成分之一(成员变量、构造器,方法,代码块,内部类),定义在类中方法外。之前我们定义的方法有的有static修饰,有的是没有的,有什么不同?2.static修饰的成员变量是什么?

Javascript_tsj的博客 6337

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java-static关键字详解

static 关键字在Java中用于修饰类的成员变量、方法、代码块和内部类。它的主要作用是使得这些成员属于类本身,而不是某个特定的实例。本文将详细介绍 static 关键字的各种用法及其实际应用,并澄清一些常见的误区。

边走、边悟、迟早变好 2267

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java static 关键字详解

静态成员是Java类的共享资源,通过static关键字修饰变量、方法、代码块和内部类。静态成员属于类而非实例,类加载时初始化,可直接通过类名访问。静态变量被所有对象共享,常用于计数器等场景;静态方法只能访问静态成员,适合工具类;静态代码块在类加载时执行一次;静态内部类不依赖外部类实例。使用static import可简化静态方法调用。注意静态方法不能直接访问实例成员,需通过对象引用。合理使用static能优化内存并简化代码结构。

m0_53543414的博客 1111

java中static关键字详解

【摘要】 static关键字用于修饰成员变量和方法,使其成为类共享的静态成员。静态变量(如static int count)被所有对象共享,可通过类名(Person.count)直接访问;静态方法(如ArrayUtil.printArr())无需实例化即可调用,但不可直接访问非静态成员。工具类(如ArrayUtil)通常用private构造方法禁止实例化,仅通过静态方法提供功能。静态变量在JDK8+中存储于堆的Class对象内。注意事项:类体中不能单独写赋值语句,需通过静态代码块或方法内赋值;静态方法中不可

Wang1200120的博客 262

Java中static关键字详解

最近在阅读《Java编程思想》看到关于static关键字的知识,感觉比较有趣,加上个人的理解在这里写篇博客记录一下٩(๑>◡<๑)۶ 概述 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。 简单来说就是:方便在没有创建对象的情况下来进行调用(方法/变量)。 定义...

梦呓~ bolg 1582

Java 中 static 关键字详解

static关键字在 Java 中有着广泛的应用,它可以修饰变量、方法、代码块和内部类,每一种用法都有其独特的特点和适用场景。掌握static关键字的用法,能够帮助我们写出更高效、更清晰的 Java 代码。希望通过本文的介绍,大家对static关键字有了更深入的理解。在实际编程中,要根据具体需求合理使用static关键字,避免陷入常见的误区。

Toroto5的博客 627

Java 关键字static详解

一、static基本描述对于关键字static ,大家应该不会陌生,因为一直编写: public static void main(String args[]) {...}那static表示什么呢?static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是要注意一点:Java语言中没有全局变量的概念。 二、使用static定义属性我们先来看一个表

wei_zhi的博客 6545

Java基础(十):关键字static详解

你真的了解 Java 中的 static 吗?它看似简单,实则蕴含了类级别成员的核心机制。从静态变量共享数据,到静态方法工具化设计,再到静态内部类实现优雅架构,这篇文章将为你全面解锁 static 的强大与细节!

从基础到源码解析的学习记录 1975

关于Java 中static关键字的用法详解

static关键字用于修饰成员变量、方法、代码块以及嵌套类。通过static修饰的成员归属于类本身,而不是某个特定的实例。本文将详细讲解static关键字的含义、用法、作用以及注意事项,并通过代码示例帮助读者深入理解其功能和使用场景static关键字在Java中用于定义类的共享成员和方法,从而为类的设计和开发提供了更高效的工具。无论是静态变量、静态方法、静态代码块,还是静态嵌套类,static都在不同的场景下展现了其强大的功能。通过本文的介绍和代码示例,相信读者对static关键字有了更深刻的理解。

技术分享 1387

Java 中的 static 关键字详解

关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。类变量:使用 static 关键字修饰的成员变量。定义格式:static 数据类型 变量名;复制代码。

m0_73311735的博客 5231

详解Java Static关键字

详解Java static关键字,含面试题

Wrysunny__的博客 294

Java中的static关键字详解

** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法。调用一个静态方法就是 “类名.方法名” ,静态使用方法就是这么简单,举个例子,代码如下: package com.yf1010; import java.awt.FlowLayout; import java.awt.Graphics; import java.util.Date; import javax.swing.JButton; import javax.swi

qq_39350172的博客 365
上一篇: Webservice学习笔记
下一篇: 解决eclipse Pydev中import时报错Unresolved import requests的方法
github_zwl
博客等级 码龄11年 300粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值