黑马程序员___Java静态方法,静态变量,初始化顺序

  ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

        所有static成员都是在程序装载时初始化的,被分配在一块静态存储区域.。这个区域的成员一旦被分配,就不再改变地址啦。直到程序结束才释放。这里特别提下被声明为static的main()就存储在这里。尽管包含main()的类还没有被实例化,但是main()方法已经可以使用啦。而且JVM将会自动调用这个方法。通过main()的调用,再实例化其他的对象, 也包括自己所在的类。

1. 静态方法:

 

        成员变量分为实例变量和静态变量。其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量。而静态变量被该类所有的对象公有(相当于全局变量),不需要实例化就已经存在。

 

方法也可分为实例方法和静态方法。其中,实例方法必须在类实例化之后通过对象来调用,而静态方法可以在类实例化之前就使用。与成员变量不同的是:无论哪种方法,在内存中只有一份——无论该类有多少个实例,都共用同一个方法。

 

实例方法的调用:

 

                                    ClassA a = new ClassA();    //必须经过实例化

 

                                     a.instanceMethod();

 

静态方法的调用:

 

                                     a.staticMethod();         //无需经过实例化

 

2. 静态方法的声明和定义

 

       定义一个静态方法和定义一个实例方法,在形式上并没有什么区别,只是在声明的头部,需要加上一个关键字static。它的一般语法形式如下:

 

[访问权限修饰符] static [返回值类型] 方法名([参数列表]){

 

        语句序列

 

}

 

例如下面是一个静态的方法:

 

public  static  void stFun(){

 

     System.out.println("这是一个静态方法");

 

}

 

3.静态方法和实例方法的区别

 

静态方法和实例方法的区别主要体现在两个方面:

 

  ●     在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

 

  ●     静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

 

 

 

实例代码: 静态方法访问成员变量示例

 

class accessMember{

 

        private static int sa;  //定义一个静态成员变量

 

        private         int ia;     //定义一个实例成员变量

 

        //下面定义一个静态方法

 

       static void statMethod(){

 

                  int i = 0;              //正确,可以有自己的局部变量

 

                  sa = 10;             //正确,静态方法可以使用静态变量

 

                  otherStat();        //正确,可以调用静态方法

 

                  ia = 20;              //错误,不能使用实例变量

 

                  insMethod();      //错误,不能调用实例方法

 

       }

 

       static void otherStat(){

 

       }

 

       //下面定义一个实例方法

 

       void  insMethod(){

 

                int i = 0;              //正确,可以有自己的局部变量

 

                sa = 15;              //正确,可以使用静态变量

 

                ia = 30;              //正确,可以使用实例变量

 

               statMethod();          //正确,可以调用静态方法

 

       }

 

}//end of class accessMember

 

 

 

4.静态代码块

 

在类中,可以将某一块代码声明为静态的,这样的程序块叫静态初始化段。静态代码块的一般形式如下:

 

    static {

 

          语句序列

 

     }

 

  ●     静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。

 

  ●     静态代码块里面的变量都是局部变量,只在本块内有效。

 

  ●     静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。

 

  ●     一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。

 

  ●     静态代码块只能访问类的静态成员,而不允许访问实例成员。

 

 

 

public class staticBlock{

 

        //定义一个普通的main()方法

 

        public static void main(String args[]){

 

        System.out.println("This is main method."); 

 

       }

 

      //定义一个静态代码块

 

     static{

 

         System.out.println("This is static block.");

 

         int stVar = 0;   //这是一个局部变量,只在本块内有效

 

      }

 

}

 

 

 

编译通过后,用java命令加载本程序,会得到如下输出:

 

This is static block.

 

This is main method.

 

从以上输出结果中可以看出,静态代码块甚至在main方法之前就被执行。在main()方法中可以完成的任务在静态代码块中都可以完成。但是二者在执行上仍然有一些区别,main方法是整个程序启动的入口,而静态代码块是存在于某个类中的一个过程。

 

5.静态成员变量

 

Java允许以类作为静态成员变量的类型,那么静态成员变量就是一个对象。如果是基本数据类型的静态成员变量,在类的外部可以不必创建对象就直接使用。但如果静态成员是对象,问题就要复杂得多。因为对象所属的类,既可能有静态成员,也可能有实例成员。而其中的实例成员必须要在对象实例化后才能使用,问题的核心在于:系统是否会为静态的类变量创建实例 。

 

//-----------文件名supplyTest.java-----------------

 

public class supplyTest{

 

         //定义一个静态方法供测试用

 

         public static void statShow(){

 

                System.out.println("这是静态方法");

 

         }

 

         //定义一个实例方法供测试用

 

         public void  instShow(){

 

              System.out.println("这是实例方法");

 

        }

 

}//end of supplyTest.java

 

//-----------文件名supplyTest.java-----------------

 

 

 

下面这个程序中,定义了一个supplyTest类型的变量,作为静态成员,没有显示地实例化它。

 

//-----------文件名hasStatMember.java-----------------

 

public class hasStatMember{

 

      static  supplyTest  stVar;     //定义一个静态成员

 

      public static void main(String args[]){

 

               stVar.statShow();           //调用静态方法

 

               stVar.instShow();           //调用实例方法

 

      }

 

}

 

//-----------文件名hasStatMember.java-----------------

 

 

 

这个程序可以编译通过,但它运行的结果如下:

 

这是静态方法

 

Exception in thread "main" java.lang.NullPointerException

 

        at hasStatMember.main(hasStatMember.java:5)

 

从运行结果中可以看出,静态方法被正常执行,但实例方法不能执行,原因是未创建对象实例。这说明尽管stVar被声明成static类型,系统仍然不会自动为它创建对象,所以程序必须改成如下内容才能正常运行:

 

 

 

//-----------文件名hasStatMember.java-----------------

 

public class hasStatMember{

 

        static supplyTest stVar = new supplyTest();     //定义一个静态成员并实例化它

 

        public static void main(String args[]){

 

                   stVar.statShow();                             //调用静态方法

 

                  stVar.instShow();                             //调用实例方法

 

        }

 

}

 

//-----------文件名hasStatMember.java-----------------

 

 

 

程序的输出结果是:

 

这是静态方法

 

这是实例方法

 

从输出结果中可以看出,stVar的实例化是在定义时完成的,这意味着在hasStatMember类的外部可以像在内部一样使用它。下面这个程序演示了对stVar的使用形式。

 

//-----------文件名useStVar.java-----------------

 

public class useStVar{

 

          public static void main(String args[]){   

 

                     hasStatMember.stVar.statShow();     //调用静态方法

 

                     hasStatMember.stVar.instShow();     //调用实例方法

 

          }

 

}

 

//-----------文件名useStVar.java-----------------

 

程序的输出结果如下:

 

这是静态方法

 

这是实例方法

 

无论是静态方法还是实例方法,都是通过“类名.静态变量名.方法名”的形式来使用的。读者可能会觉得这种形式有点眼熟。确实如此,前面大量使用的“System.out.println”就是这种形式。其中,System是系统预定义好的一个类,out是它的一个静态成员,println是out的一个实例方法。

 

6.Java中的初始化顺序

 

JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

 

初始化顺序:先初始化父类的静态代码--->初始化子类的静态代码--> (创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码(变量定义等)--->初始化父类构造函数--->初始化子类非静态代码(变量定义等)--->初始化子类构造函数

 类只有在使用New调用创建的时候才会被JAVA类装载器装入创建类实例时,首先按照父子继承关系进行初始化类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法类消除时候,首先消除子类部分,再消除父类部分

 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

转载于:https://www.cnblogs.com/miaozy/p/3679410.html

Windows11配置WSL2支持代理上网 说起来本来这个功能我也不需要的,只是最近突然有个需求就顺便研究了下,WSL2默认的网络方式是NAT,即WSL2的网卡本身是虚拟网卡,通过以太网或WIFI的地址转换来上互联网,我试了下是不能直接走代理的,最近比较忙没具体研究,但是我用另一种方式实现了,下面介绍给需要的人。注意:这个方法只能是WIndows11系统,WIndows10系统上的WSL2缺少了一项功能导致不可用。1、方法总体没什么难度,NAT方式暂时没研究透,后续有时间再研究2、WIndows10系统不支持mirrored,暂时需要另辟蹊径。 阅读详情

相关推荐

01|无代码开发 | 如何使用Zion实现导航网站制作

以上就是我制作导航网站的心得,分享给大家,作为一个小白想要独立搭建一个网站还是比较困难的,而在Zion不仅可以用可视化的方法进行搭建,甚至还可以一键发布,不用考虑服务器域名啥的问题,真是太方便了。

2301_76262110的博客 1390

Java静态方法,静态变量,初始化顺序

1. 静态方法:         成员变量分为实例变量和静态变量。其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量。而静态变量被该类所有的对象公有(相当于全局变量),不需要实例化就已经存在。 方法也可分为实例方法和静态方法。其中,实例方法必须在类实例化之后通过对象来调用,而静态方法可以在类实例化之前就使用。与成员变量不同的是:无论哪种方法,在内存中只有

leeyu35的专栏 4万+

ABAP - Function ALV 11 - 单元格下拉框

【代码】ABAP - Function ALV 11 - 单元格下拉框。

HeathlX的博客 1812

Java中静态(static)成员何时才会初始化

首先我们要知道一个类的生命周期是什么?一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段: 其中连接一般会跟加载阶段和初始化阶段交叉进行,而连接又具体分为验证、准备、解析三个步骤。明白这些我们再来看一开始提出的问题:静态成员什么时候才会初始化? private static int a=1; private static final int b=2 在类加载的准备阶段会给所有static 成员在方法区中分配内存,并设置变量初始值为零值(根据类型不同零值也并...

weixin_44393055的博客 2792

Imputation Methods for scRNA Sequencing Data

越来越多的研究者使用单细胞RNA测序(scRNA-seq)技术来表征单细胞水平的转录图谱。他们用它来研究复杂组织的异质性、转录组动力学和未知生物的多样性。然而,在基因表达模式随机性的scRNA-seq数据中普遍存在许多技术和生物学上的噪音。这些数据通常具有高维、稀疏和大量“dropout”值的特点,并且受批处理效应的影响。scRNA-seq数据中大量的“dropout”值严重掩盖了基因之间的重要关系,阻碍了下游分析。因此,scRNA-seq数据dropout值的估算就显得尤为重要。

qq_34179307的博客 540

The moving least square approximation(MLS).

移动最小二乘法, moving least square

fanglovel的博客 299

java类中的静态变量是什么时候初始化的

我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。 在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。

破晓 2万+

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 2015

黑马程序员:JAVA中代码顺序,静态块 静态变量,加载顺序!

这两天遇到几个类似的问题,就是一个程序到底是怎么运行的,而且这些问题很具有迷惑性,这里两个例子做分析( 实际上一切都在黑马的免费视频中有体现 ) ! 问题一:如下代码的执行顺序是什么样的!一定理解:是执行的顺序(后面会给大家说一个误区)! classTest{        int a =5;         staticint num =4;              

wangsenhong的专栏 988

【全覆盖算法】栅格地图实现布氏单元分解算法+栅格地图实现牛耕Boustrophedon Cellular Decomposition Path Planning

本文先对做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 282

智能解译城市进程:遥感影像建筑物提取研究全景与前沿进展(数据集及代码)

随着全球城市化进程的加速,高效、精准地监测城市建筑物分布对城市规划、灾害评估、人口估算及智慧城市建设具有重要意义。传统的人工测绘方法耗时费力,难以满足大范围、动态更新的需求。而遥感影像建筑物提取技术,借助深度学习与计算机视觉,能够自动化识别并提取建筑物轮廓,极大地提升了城市信息获取的效率和精度。首先,建筑物提取是遥感影像解译的核心任务之一。

hanfeng5268的博客 591

黑马程序员-java语言特点4:静态方法变量的初始化

----------------------android培训、java培训、期待与您交流! ---------------------- 加载一个类时,它的静态初始化代码被执行。静态初始化代码段与静态变量的初始化同时进行,它们按词法顺序执行。例如,一个类c的声明如下: class c{ ...

auu54806的博客 143

1️⃣ Coze智能体基础入门教学(2025年全新版本)

不妨设想一下,倘若我们能够打造出一个数字助手,它不但能精准洞悉我们的需求,更可以独立思索、学习以及付诸行动,这便是 AI Agent 的基础理念。它恰似计算机世界里的 “智慧精灵”,能够感知周遭环境、做出判断并采取行动。AI Agent 的发展之路精彩纷呈。它走过了三个重要阶段:起初,它犹如一个被规则束缚的机器人,只能按预设好的指令开展工作。接着,它学会运用统计学方法,通过分析数据来做决策,变得越发灵活。到如今,凭借深度学习技术,它已经能够像人类一样去学习复杂的任务了。

李同学Lino的博客 4083

黑马程序员——JAVA笔记——静态static

在java中,static作为静态修饰符用来修饰成员变量和成员方法。 被static修饰的成员变量或成员方法,独立于该类的任何对象,也就是说他不依赖于该类的实例,同时也可以被所以实例所共享。 静态成员在类第一次被加载的时候就会被虚拟机加载到方法区中。 因此静态成员可以直接通过类名调用来访问。 类名.静态方法名(参数列表...); 类名.静态变量名; 一、static的用途 1

安安安的博客 474

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

黑马程序员——Java基础——对象的初始化

通过学习基础知识对初始化的过程有了简单的了解,复习时根据对象初始化的先后顺序将之前学到的知识点串联起来,加深印象 上面程序的运行结果是: 1.static(静态) static是一个修饰符,用于修饰成员(成员变量,成员函数)。 1)调用方法:除了可以被对象调用外,还可以直接被类名调用。格式:类名.静态成员。 2)静态的特点:1,随着类的加载而加载。

Goalgate的博客 593

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

黑马程序员--static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建

wkf55558963572516的专栏 451

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

黑马程序员_第四天

----------------------android培训、java  培训、期待与您交流! ---------------------- 今天看到有点晕额,特别是构造函数 和super ,弄的有点乱,执行顺序有点搞混淆了,     构造函数 第一:构造函数名与类名相同; 第二:构造函数不返回任何值,也没有返回类型; 第三:每一类可以有零个或多个构造方法; 第四:构造方法在创建

lichuang513的专栏 294

【java】Java基础学习总结(b站黑马程序员课程)

自身学习代码(详细代码请关注黑马程序员领取)

BokerGotii的博客 2062

黑马程序员——java基础面试题之面向对象

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失

DoSamba的博客 1491

黑马程序员—static关键字—知识点总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 静态:static 关键字:static     一个修饰符,用于修饰成员(成员变量和成员函数)。    特点:       1.想要实现对象中的共性数据的对象共享,可以将这个数据进行静态修饰     2.被静态修饰的成员可以被类名调用(也就是说静态成员多了一种调用方式。类名.

showingtime的专栏 440

黑马程序员—static关键字

---------------------- ASP.Net+Android+IO开发S、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训、期待与您交流! ---------------------- static: 用法: 是一个修饰符,用于修饰成员(成员变量,成员方法)。当成员被静态修饰后,就多了一个调用方式,可以直接被类名调用(类

黑马_飞飞 725

黑马程序员__静态

------- android培训、java培训、期待与您交流! -------- 1.静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法。 · 它们只能访问static数据。 · 它们不能以任何方式引用this 或super。 cla

@Control 408

黑马程序员0826_java基础知识

---------------------- android培训、java培训、期待与您交流! ---------------------- 在一个类中可以定义一个叫public void finalize()的方法(已尝试,不管是private还是其他返回均报错),在调用

354

黑马程序员-java关键字static详解

static表示“全局”或者“静态”的意思,是一个修饰符,用于修饰成员变量和成员方法,也可以形成静态代码块。 static的特点: 1、随着类的加载而加载。也就是说,静态会随着类的消失而消失。说明它的生命周期最长。 2、优先于对象存在。

Fivedays的专栏 794

4.static---黑马程序员

D:\code\黑马\code\oop-up-app\src\com\lmh\staticdemo01:有static修饰,属于类,在计算机中只有一份,被类的所有对象共享:无static修饰,每个对象中的实例变量均独立。

weixin_45336151的博客 151

传智播客黑马Java学习笔记_day07

构造函数 一个类中如果没有定义构造函数,那么会有一个默认空参的构造函数,如果已经定义了一个构造函数,那么默认的空参的构造函数就没有了 什么时候需要定义构造函数 在描述事物时,该事物已存在就具备一些内容,这些内容都定义在构造函数中。 class Person{ private int age; private String name; Person(){ ...

weixin_41285610的博客 221
上一篇: 黑马程序员___java实现字符串反转
下一篇: 黑马程序员___集合知识汇总
alg89136
博客等级 码龄12年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值