本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过。
一。JAVA中执行顺序
- 静态块
- 块
- 构造器
- 父类构造器
二。JAVA中赋值顺序
- 静态块直接赋值
- 块直接赋值
- 父类继承的属性已赋值
- 静态变量声明时赋值
- 成员变量声明时赋值
- 构造器赋值
第一部分很好测试,我们只需要写一个子类,类中定义一个静态块,一个普通块,一个构造器,它的父类构造器,都打印一条语句,即可明白它们直接的执行顺序
Mastiff类
/**
* 子类藏獒
*/
public class Mastiff extends Dog {
public Mastiff() {
System.out.println("Mastiff");
}
{
System.out.println("block");
}
static {
System.out.println("static block");
}
public static void main(String[] args){
Mastiff mastiff=new Mastiff();
}
}
DOG类
/**
*DOG父类
*/
public class Dog {
public Dog() {
System.out.println("Dog");
}
}
运行结果为:
static block Dog block Mastiff
|
也就是说,在我们的程序中,实例化一个类对象的时候,运行顺序为:
- 静态块
- 父类构造器
- 本类中的块
- 本类的构造器
我们可以更进一步,如果在父类中也有块和静态块呢?
DOG类改进后源码
/**
*DOG父类
*/
public class Dog {
public Dog() {
System.out.println("Dog");
}
static{
System.out.println("super static block");
}
{
System.out.println("super block");
}
}
Mastiff改进后源码
/**
* 子类藏獒
*/
public class Mastiff extends Dog {
public Mastiff() {
System.out.println("Mastiff");
}
{
System.out.println("block");
}
static {
System.out.println("static block");
}
public static void main(String[] args){
Mastiff mastiff=new Mastiff();
}
}
运行的结果为:
super static block static block super block Dog block Mastiff
|
也就是说此时的运行顺序为:
- 父类静态块
- 自身静态块
- 父类块
- 父类构造器
- 自身块
- 自身构造器
好了,知道了运行的顺序,那么这是为什么呢?
这就要从JVM中类的装载机制和实例化机制开始说起,这里因为主题原因,先不讨论,有兴趣的同学可以自己查资料。
|
我们再来讨论第二个问题,一个变量的值,它有可能在哪些地方确定呢??
- 从父类继承该值(包括:1.作为父类的成员变量已经赋值 2.在父类的块中赋值 3.在父类的构造器中赋值)
- 在构造器中对其进行赋值
- 在块中进行赋值
-
在方法调用中进行赋值
现在假设在我们刚刚的例子中,有一个变量type,表示狗的品种
/**
*DOG父类
*/
public class Dog {
public String type="父类成员变量赋的值";
public Dog() {
System.out.println("父类构造器--type-->"+type);
type="父类构造器赋的值";
System.out.println("父类构造器----type--->"+type);
}
{
System.out.println("block---type--->"+type);
type="父类块赋的值";
}
}
/**
* 子类藏獒
*/
public class Mastiff extends Dog {
public String type="成员变量赋的值";
public Mastiff() {
System.out.println("构造器---type--->"+type);
type="构造器赋的值";
}
public void say(){
System.out.println("say---type---->"+type);
}
{
System.out.println("block---type--->"+type);
type="块赋的值";
}
public static void main(String[] args){
Mastiff mastiff=new Mastiff();
mastiff.say();
}
}
执行结果如下:
block---type--->父类成员变量赋的值 父类构造器--type-->父类块赋的值 父类构造器----type--->父类构造器赋的值 block---type--->成员变量赋的值 构造器---type--->块赋的值 say---type---->构造器赋的值
|
答案很明显,赋值顺序为:
- 父类成员变量赋值
- 父类块赋值
- 父类构造器赋值
- 自身成员变量赋值
- 自身块赋值
- 自身构造器赋值
结合我们前面说的程序中的执行顺序,这个显然是很好理解的:
1.成员变量赋值>>>块赋值>>>构造器赋值
2.父类的块>>父类构造器>>自身块>>自身构造器
又因为一个成员变量是不可能在静态变量中赋值的,而且又前面程序执行顺序可知
静态块>>块
所以,程序的赋值步骤为
- 父类的静态变量赋值
- 自身的静态变量赋值
- 父类成员变量赋值
- 父类块赋值
- 父类构造器赋值
- 自身成员变量赋值
- 自身块赋值
- 自身构造器赋值
分享到:
相关推荐
以下是关于JAVA程序执行顺序的详细解释: 1. **静态块**: 静态块是在类加载时执行的,它不依赖于类的实例。在上述代码中,`Mastiff`类的静态块`static block`会在类被加载到JVM(Java虚拟机)时执行,这是在任何...
### Java虚拟机与Java程序的生命周期 ...了解类的加载过程对于理解Java程序的执行流程、优化性能等方面具有重要意义。同时,掌握Java程序的生命周期有助于更好地控制程序的运行状态,提高程序的健壮性和效率。
Java程序调用存储过程是数据库操作中的常见任务,特别是在处理大量数据或需要高效执行复杂业务逻辑时。存储过程是预编译的SQL语句集合,它们可以提高性能、减少网络流量,并提供更好的安全性。在Java应用程序中调用...
总的来说,将Java程序制作成可执行程序或安装程序,需要根据目标平台和用户需求选择合适的方法。无论是简单的JAR运行,还是复杂的安装程序生成,都有相应的工具和技术支持。理解这些方法可以帮助开发者更好地分发和...
在给定的标题"java程序自动重新启动"中,我们可以理解这是一个实现了自动重启逻辑的Java程序。描述指出,这个程序由三个.java文件组成:Test.java、Watch.java和AbstractRun.java,它们构成了一个简单的自动重启系统...
顺序结构是指程序的执行顺序,从上到下依次执行。选择结构是指根据条件选择执行不同的分支,包括if语句和switch语句。循环结构是指重复执行某个语句,包括for语句、while语句和do-while语句。 四、JAVA Application...
以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...
Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...
对于初学者来说,这个程序提供了一个良好的学习平台,可以深入了解面向对象编程、游戏逻辑实现以及GUI(图形用户界面)设计等核心概念。 首先,让我们从编程语言本身开始。Java是一种广泛使用的、跨平台的编程语言...
通过分析和运行`test.java`样例,你可以更深入地了解Java程序的编写、编译和执行流程,这对于学习Java编程是非常有帮助的。记得,实践是最好的老师,动手尝试编写和运行自己的Java程序,将理论知识转化为实际操作,...
在存储过程和Java程序的上下文中,SQL*Loader可能用于准备数据,然后由存储过程处理或通过Java程序进行进一步操作。 综上所述,"存储过程调用Java程序"涉及到的主要知识点包括: 1. 存储过程的概念和使用。 2. ...
在Java开发过程中,经常需要与数据库进行交互,尤其是在处理大量数据时,如何高效地执行SQL语句变得尤为重要。本文将详细介绍如何利用Java进行批量SQL执行,包括其背景、实现原理、代码示例及优化策略等。 #### 一...
在本项目中,JNA可能被用来访问特定的系统功能或者与硬件进行交互,增强了Java程序的功能性和效率。 3. **Exe4j**: Exe4j是一款用于生成Windows平台下可执行程序(.exe)的工具。它可以将Java应用打包成一个独立的...
通过这个过程,你可以轻松地创建一个.bat文件来运行Java程序,这对于日常开发或者自动化部署非常有用。当然,这只是一个基础示例,实际应用中可能需要处理更复杂的逻辑,如参数传递、异常处理等。理解并掌握这些知识...
"JAVA程序编辑器[java程序编写器]"是一个专为Java初学者设计的工具,它简化了代码编写、编译和调试的过程,使学习变得更加便捷。 这个编辑器的主要特点可能包括: 1. **用户友好界面**:对于初学者,简洁明了的...
首先,我们需要了解Java程序的运行机制。Java程序是由JVM(Java虚拟机)执行的,通过`java`命令来启动。如果Java程序依赖于外部的jar库,我们可以通过`-cp`或`-classpath`选项指定类路径,使得JVM能够找到这些库。...
本文将详细讲解如何通过Java执行命令行程序,以及在处理过程中可能遇到的线程阻塞问题。 首先,我们来看标题提到的"通过JAVA执行命令行程序"。Java提供了Runtime类的exec()方法来执行外部命令。例如,如果你想要在...
在Java编程世界中,开发第一个Java程序是每个初学者必经的步骤,它标志着你正式踏入这个强大且广泛应用的编程语言领域。Java以其跨平台、面向对象和安全性等特性,被广泛应用于各种软件开发,包括桌面应用、移动应用...
了解并掌握这些基本概念对于初学者来说至关重要,因为它们构成了Java程序开发的基础。随着对Java语言的深入学习,你还将接触到类、对象、继承、多态等面向对象编程的核心概念,以及异常处理、输入/输出流、集合框架...