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中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...
Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...
接下来,我们将探讨**构造方法执行顺序**。在创建一个对象时,构造方法负责初始化对象的状态。构造方法分为实例构造方法和类构造方法(即静态初始化块)。构造方法的执行顺序如下: 1. 首先,执行父类的静态代码块...
这里我们将深入探讨Java中的普通代码块(实例初始化块)和静态代码块的执行顺序,并通过实例来阐述这一概念。 首先,我们需要明白两种类型的代码块: 1. 静态代码块(Static Block):这些代码块在类加载时执行,...
考虑文章提供的`class A`、`class B`及`Test`类的示例,可以看出类的执行顺序遵循以下规则: 1. 类加载时,先执行父类的静态代码块,随后执行子类的静态代码块。 2. 对象创建时,先执行类中的非静态代码块,再调用...
关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是finally语句块是否一定会执行的问题。很多人第一反应是...
标题中的“java简单方法顺序调用注解”是指使用注解来控制类中方法的执行顺序。这在某些场景下非常有用,比如初始化逻辑、测试脚本或者需要特定顺序执行的任务。下面我们将深入探讨如何实现这一功能。 首先,我们...
下面将详细探讨`static`在不同场景下的应用。 #### 二、static变量 ##### 1. 静态变量(类变量) - **定义**:被`static`修饰的变量称为静态变量或类变量。 - **特点**: - 内存中只有一个拷贝,节省内存空间。 ...
Static 块的执行顺序是按照它们在类中的出现顺序执行的。需要注意的是,static 块在类加载时只执行一次,不管该类实例化多少次。 构造函数的概念 在 Java 中,构造函数是指在类实例化时执行的特殊方法。构造函数的...
理解它们的执行顺序对于编写高效且无误的Java代码至关重要。 首先,让我们详细探讨非静态自由块。非静态自由块不包含static关键字,它们通常用于在创建对象时执行一些初始化操作。当一个类的实例被创建时,非静态...
下面我们将详细探讨Java中代码块的执行顺序,包括静态属性、非静态属性、静态代码块、非静态代码块以及构造函数。 首先,让我们回顾一下结论: 1. 当创建一个类的实例时,首先会执行类中的静态属性和静态代码块,...
在FFmpeg中,有多个核心组件和命令行选项值得深入探讨: 1. **组件**: - **ffprobe**:这是一个诊断工具,用于分析媒体文件的元数据,如编码格式、分辨率、帧率等。 - **ffmpeg**:主要的命令行工具,执行音频和...
《数据结构(Java 描述)》课程中的案例01探讨了如何就地逆置一个顺序表,即在不额外消耗显著空间的情况下,反转一个存储整数的数组。在这个案例中,我们关注的重点是算法的设计、分析和实现。 1. 算法设计 顺序表...
2. 静态初始化块:当类第一次被加载时执行,按块的顺序执行。 3. 实例字段:在构造器内部,按照声明的顺序初始化。 4. 实例初始化块:在构造器执行之前,按块的顺序执行。 例如: ```java public class MyClass { ...
这些块的执行顺序对于理解和编写复杂的Java程序至关重要,特别是在涉及继承关系时。下面我们将深入探讨这些概念及其在继承中的调用顺序。 ### 静态块 静态块是Java类中用于初始化静态变量的代码块。它们在类加载时...
在“Java学习~求三角形面积的顺序结构”这个主题中,我们将深入探讨如何利用Java来计算三角形的面积,并了解相关概念。 首先,三角形面积的计算公式是:`面积 = 底 * 高 / 2`。在Java中,我们可以创建一个简单的...
当类被加载时,静态初始化块会按照它们在代码中的顺序执行一次。 2. 静态初始化块可以用于更复杂的初始化逻辑,比如读取配置文件来初始化静态变量。 五、静态导入 1. Java允许使用`import static`语句导入类的...
本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础知识 1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**...