`
dianziermu
  • 浏览: 139722 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

探讨static的执行顺序

    博客分类:
  • J2SE
阅读更多

public class Test
{
        public static void main(String[] args){ System.out.println(OK.i); }
}

 

情况1:
class OK
{  
static  int i=0;
static   { int i=5; }
}

情况2:
class OK
{  
static   { int i=5; }
static  int i=0;
}

情况3:
class OK
{  
static  int i=0;
static   { i=5; }
}

情况4:
class OK
{  
static   { i=5; System.out.println(OK.i);} 
static  int i=0;

}


情况1与2,输出结果相同,都为0;
情况3,输出5;情况4,输出5,0;

 

============================

说明:

·   第一static{}和static属性的区别,static{} 是类作初始化的一种方式, 可以做很多事情。 比如对象的初始化, 调用别的方法等等。 静态属性, 这是类的一部分 main 方法是输出类的静态属性 , 这点很重要    

·   1,2 两种情况很好解释 , 是因为 static{int i=0;} 不是初始化类的属性 , 而就是定义一个变量而已 , 给你换一种写法static{int i=0;int j=i+10;}这 说明什么 ? 就是在这个静态块作计算而已 , 和你的静态属性一点关系没有 , 你搞一个同名的 ? 很混淆视听的 , 不如起不同的名字了

·3,4两种情况更好解释了,这次你是在初始化你的静态属性了,因为static{ i=0},没有int的啊 ,也就是没有定义新的变量,这个i就是你的静态变量。由于jvm处理静态东西是在类的加载一同处理的,就是一个顺序执行的过程,我这样说不知道你明白没有。  

以下是对情况 4 的详解:

·   输出的结果是 5,0 ,原因很简单啊,这个东西是顺序执行的,对了,我知道你的问题了 ^&^ 你是后定义静态属性的,但是还能用 static{} 来初始化 好在我看过 jvm 虚机的一些知识。这些类的信息都是放在一个公用的堆栈,当你调用这个类的时候,类的所有信息都已经加载内存里(当然是 jvm 的分配和管辖的,而且就是唯一这一份信息)。

·     所以在你 static 初始化的时候,它已经存在了,因此就是 5 ,当执行 int i=0; 的时候,自然就是 0 了,不过此时执行的是 i=0, 因为实际上这个属性已经在内存了。

 ·  如果你还不懂话,就需要知道什么时候类加载到内存 , 就是我们通常说的反射中Class类,这个在你每编译一个类的时候,jvm给你做了黑匣子自动放到类的class中。因此最通常是类加载到内存的方法,就 是new 一个对象,还有别的方法,比如调用类的静态方法和静态属性,所以static int i=0;作用是定义一个类的静态属性作用,本应该int=0初始化一番,但是static{}和它优先级一样高,所以顺序执行一番了。

 

=================以下为构造方法和static混合==================

 

public class StaticInit
{
   static int i;
   int a;
   public StaticInit()
   {
      a=6;
      System.out.println("a 的初始化"+a);
   }
   public static void main(String[] args)
  {
    new StaticInit();
  }
  static
  {
     i=5;
     System.out.println("i 的初始化"+i);
  }
}
 

 

输出结果:

i 的初始化5
a 的初始化6

说明:

类应该先运行static方法,应该按顺序运行:

静态成员 ->  静态块 -> 然后再运行非静态成员 最后再运行 构造函数 (一般系统默认运行不带参数的构造函数);

 

 ============继承关系的例子(也是运用这种规则)======================

    --------Test.java------

public class Test {

 static int i = 1;// 对i 赋值

 public void method() {
  System.out.println("Test-普通方法 " + i);
 }

 public Test() {
  System.out.println("Test-构造方法 " + i);
 }

 static {
  System.out.println("Test-static-first " + i);
  i = 4;// 再次赋值,覆盖原值
  System.out.println("Test-static-second " + i);
 }

} 
 

 


-----------SubTest.java------------

 

public class SubTest  extends Test {// 继承TestStatic方法

 static int n = 2;// 对n赋值

 public SubTest() {
  System.out.println("SubTest-构造方法 " + n);
 }

 public static void main(String args[]) {
  SubTest t = new SubTest();
  t.method();// 调用父类方法
 }

 static {
  System.out.println("SubTest-static-first " + n);
  n = 3;// 再次赋值,覆盖原值
  System.out.println("SubTest-static-second " + n);
 }
} 
 


运行结果:

Test-static-first 1
Test-static-second 4
SubTest-static-first 2
SubTest-static-second 3
Test-构造方法 4
SubTest-构造方法 3
Test-普通方法 4

说明:
    首先运行子类的static属性 static int n = 2;但是紧接着static块又为n赋值,又因为n为静态所以n值永远为3;
    然后运行main()函数,出现new()方法,因为是子类 初始化父类,i 赋值与n原理相同所以 i输出永远为4;
    父类初始化同样按照static -> 非static -> 构造函数,初始化子类,因为子类static部分已经初始化,所以直接非static -> 构造函数 ->继续运行main()中方法。

 ===========================

如果执行顺序还有其他问题,可以用jdk自带的工具javap 来查看。常用命令: javap -c ClassName

 

 

 

分享到:
评论

相关推荐

    控制台展示执行顺序

    在"控制台展示执行顺序"这个主题中,我们将深入探讨如何通过Java来实现这一点,以及它在实际编程中的应用。 首先,Java中的输出主要依赖于`System.out.println()`或`System.out.print()`方法。它们是`java.io....

    Java中的Static块与静态方法

    本文将深入探讨Java中的静态块与静态方法,解析它们的区别、联系以及执行顺序,帮助读者更全面地理解`static`关键字在Java中的运用。 ### 静态方法 静态方法是通过`static`关键字声明的,它属于类而不属于类的任何...

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

    Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    接下来,我们将探讨**构造方法执行顺序**。在创建一个对象时,构造方法负责初始化对象的状态。构造方法分为实例构造方法和类构造方法(即静态初始化块)。构造方法的执行顺序如下: 1. 首先,执行父类的静态代码块...

    Java 普通代码块静态代码块执行顺序(实例讲解)

    这里我们将深入探讨Java中的普通代码块(实例初始化块)和静态代码块的执行顺序,并通过实例来阐述这一概念。 首先,我们需要明白两种类型的代码块: 1. 静态代码块(Static Block):这些代码块在类加载时执行,...

    java中的static变量,方法,代码块

    考虑文章提供的`class A`、`class B`及`Test`类的示例,可以看出类的执行顺序遵循以下规则: 1. 类加载时,先执行父类的静态代码块,随后执行子类的静态代码块。 2. 对象创建时,先执行类中的非静态代码块,再调用...

    关于Java中try finally return语句的执行顺序浅析

    关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是finally语句块是否一定会执行的问题。很多人第一反应是...

    java简单方法顺序调用注解

    标题中的“java简单方法顺序调用注解”是指使用注解来控制类中方法的执行顺序。这在某些场景下非常有用,比如初始化逻辑、测试脚本或者需要特定顺序执行的任务。下面我们将深入探讨如何实现这一功能。 首先,我们...

    static在Java语言中的作用

    下面将详细探讨`static`在不同场景下的应用。 #### 二、static变量 ##### 1. 静态变量(类变量) - **定义**:被`static`修饰的变量称为静态变量或类变量。 - **特点**: - 内存中只有一个拷贝,节省内存空间。 ...

    java static块和构造函数的实例详解

    Static 块的执行顺序是按照它们在类中的出现顺序执行的。需要注意的是,static 块在类加载时只执行一次,不管该类实例化多少次。 构造函数的概念 在 Java 中,构造函数是指在类实例化时执行的特殊方法。构造函数的...

    在Java中自由块的执行顺序

    理解它们的执行顺序对于编写高效且无误的Java代码至关重要。 首先,让我们详细探讨非静态自由块。非静态自由块不包含static关键字,它们通常用于在创建对象时执行一些初始化操作。当一个类的实例被创建时,非静态...

    举例说明Java中代码块的执行顺序

    下面我们将详细探讨Java中代码块的执行顺序,包括静态属性、非静态属性、静态代码块、非静态代码块以及构造函数。 首先,让我们回顾一下结论: 1. 当创建一个类的实例时,首先会执行类中的静态属性和静态代码块,...

    ffmpeg-win64-static.zip

    在FFmpeg中,有多个核心组件和命令行选项值得深入探讨: 1. **组件**: - **ffprobe**:这是一个诊断工具,用于分析媒体文件的元数据,如编码格式、分辨率、帧率等。 - **ffmpeg**:主要的命令行工具,执行音频和...

    数据结构(Java语言描述) 案例01 顺序表的就地逆置.docx

    《数据结构(Java 描述)》课程中的案例01探讨了如何就地逆置一个顺序表,即在不额外消耗显著空间的情况下,反转一个存储整数的数组。在这个案例中,我们关注的重点是算法的设计、分析和实现。 1. 算法设计 顺序表...

    C++和Java初始化顺序的比较代码

    2. 静态初始化块:当类第一次被加载时执行,按块的顺序执行。 3. 实例字段:在构造器内部,按照声明的顺序初始化。 4. 实例初始化块:在构造器执行之前,按块的顺序执行。 例如: ```java public class MyClass { ...

    java 静态块实例块构造器调用

    这些块的执行顺序对于理解和编写复杂的Java程序至关重要,特别是在涉及继承关系时。下面我们将深入探讨这些概念及其在继承中的调用顺序。 ### 静态块 静态块是Java类中用于初始化静态变量的代码块。它们在类加载时...

    Java学习~求三角形面积的顺序结构

    在“Java学习~求三角形面积的顺序结构”这个主题中,我们将深入探讨如何利用Java来计算三角形的面积,并了解相关概念。 首先,三角形面积的计算公式是:`面积 = 底 * 高 / 2`。在Java中,我们可以创建一个简单的...

    Static关键字共5页.pdf.zip

    当类被加载时,静态初始化块会按照它们在代码中的顺序执行一次。 2. 静态初始化块可以用于更复杂的初始化逻辑,比如读取配置文件来初始化静态变量。 五、静态导入 1. Java允许使用`import static`语句导入类的...

    java中类的初始化顺序

    本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础知识 1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**...

Global site tag (gtag.js) - Google Analytics