一。JAVA中执行顺序
- 静态块
- 块
- 构造器
- 父类构造器
二。JAVA中赋值顺序
- 静态块直接赋值
- 块直接赋值
- 父类继承的属性已赋值
- 静态变量声明时赋值
- 成员变量声明时赋值
- 构造器赋值
第一部分很好测试,我们只需要写一个子类,类中定义一个静态块,一个普通块,一个构造器,它的父类构造器,都打印一条语句,即可明白它们直接的执行顺序
Mastiff类
Java代码
- <SPANstyle="FONT-SIZE:medium">/**
- *子类藏獒
- */
- publicclassMastiffextendsDog{
- publicMastiff(){
- System.out.println("Mastiff");
- }
-
- {
- System.out.println("block");
- }
- static{
- System.out.println("staticblock");
- }
-
- publicstaticvoidmain(String[]args){
- Mastiffmastiff=newMastiff();
-
- }
- }
- </SPAN>
/**
* 子类藏獒
*/
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类
Java代码
- <SPANstyle="FONT-SIZE:medium">/**
- *DOG父类
- */
- publicclassDog{
- publicDog(){
- System.out.println("Dog");
- }
- }
- </SPAN>
/**
*DOG父类
*/
public class Dog {
public Dog() {
System.out.println("Dog");
}
}
运行结果为:
static block
Dog
block
Mastiff
|
也就是说,在我们的程序中,实例化一个类对象的时候,运行顺序为:
- 静态块
- 父类构造器
- 本类中的块
- 本类的构造器
我们可以更进一步,如果在父类中也有块和静态块呢?
DOG类改进后源码
Java代码
- <SPANstyle="FONT-SIZE:medium">/**
- *DOG父类
- */
- publicclassDog{
- publicDog(){
- System.out.println("Dog");
- }
- static{
- System.out.println("superstaticblock");
- }
-
- {
- System.out.println("superblock");
- }
- }
- </SPAN>
/**
*DOG父类
*/
public class Dog {
public Dog() {
System.out.println("Dog");
}
static{
System.out.println("super static block");
}
{
System.out.println("super block");
}
}
Mastiff改进后源码
Java代码
- <SPANstyle="FONT-SIZE:medium">/**
- *子类藏獒
- */
- publicclassMastiffextendsDog{
- publicMastiff(){
- System.out.println("Mastiff");
- }
-
- {
- System.out.println("block");
-
- }
- static{
- System.out.println("staticblock");
- }
-
- publicstaticvoidmain(String[]args){
- Mastiffmastiff=newMastiff();
- }
- }
- </SPAN>
/**
* 子类藏獒
*/
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,表示狗的品种
Java代码
- <SPANstyle="FONT-SIZE:medium">/**
- *DOG父类
- */
- publicclassDog{
- publicStringtype="父类成员变量赋的值";
- publicDog(){
- System.out.println("父类构造器--type-->"+type);
- type="父类构造器赋的值";
- System.out.println("父类构造器----type--->"+type);
- }
-
- {
- System.out.println("block---type--->"+type);
- type="父类块赋的值";
- }
- }
- </SPAN>
/**
*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="父类块赋的值";
}
}
Java代码
- <SPANstyle="FONT-SIZE:medium">/**
- *子类藏獒
- */
- publicclassMastiffextendsDog{
- publicStringtype="成员变量赋的值";
- publicMastiff(){
- System.out.println("构造器---type--->"+type);
- type="构造器赋的值";
- }
-
- publicvoidsay(){
- System.out.println("say---type---->"+type);
- }
-
- {
- System.out.println("block---type--->"+type);
- type="块赋的值";
-
- }
-
- publicstaticvoidmain(String[]args){
- Mastiffmastiff=newMastiff();
- mastiff.say()</SPAN><SPANstyle="FONT-SIZE:medium">;</SPAN><SPANstyle="FONT-SIZE:medium">
- }
- }
- </SPAN>
/**
* 子类藏獒
*/
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程序执行顺序,你了解了吗
Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图
西南科技大学Java程序设计与实践 实验一、实验目的: 练习面向对象的图形用户界面设计、界面布局、事件设计方 法。 二、实验内容: 设计一个类似Windows计算器的Application应用程序。 三、实验要求: 1、采用Java ...
而类加载是Java程序执行过程中的一个重要的组成部分,它实现了程序的动态加载和运行。 在字节码方面,我们将从Java语言的语法和编译原理等重要内容出发,全面解读字节码在Java程序的开发和运行中的应用。我们将详细...
"Java 程序打包成可执行文件示例" Java 程序打包成可执行文件示例是指将 Java 程序编译成.class 文件,然后将其打包成一个可执行的.jar 文件,最后可以使用工具将其转换成.exe 文件。下面是详细的步骤和知识点: ...
本例通过一个简单的java程序来阐述了程序在执行过程中内存的动态分配,但分析过程非常详细,适合java初学者
java打包方法详述主要讲怎么导出包,利用JSmooth将jar包打包成可执行程序的过程
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
【批处理文件 ★自动打包★.bat】是为了简化制作JAVA程序复杂过程的特殊文件,对DOS命令不熟悉的人有很大的帮助。 下面是三个主程序和一个需要转换的JAVA游戏。 由于这个模拟器主要是真对MIDP1.1开发的,所以有些...
1.1 指出JAVA语言的主要特点和JAVA程序的执行过程。 5 1.2 说出开发与运行JAVA程序的重要步骤。 5 1.3 如何区分应用程序和小应用程序? 5 1.4 说出JAVA源文件的命名规则。 5 1.6 JAVA语言使用什么字符集?共有多少个...
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
这将创建一个名为test的存储过程,该存储过程调用Java程序的modify方法。 四、创建触发器 最后,我们需要创建一个触发器来调用存储过程。我们可以使用CREATE TRIGGER语句来实现这一步骤。例如: ``` create or ...
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
设计解决问题 的策略 基本程序设计--设计解决问题的策略 本讲主题 1 理解什么是程序 2 了解程序设计的基本步骤 3 掌握设计解决问题的策略 程序一词来自生活,通常指完成某些事物的一...//Java程序 public class Comput
Java 程序生成 exe 可执行文件详细教程 Java 程序生成 exe 可执行文件是 Java ...本文详细介绍了如何将 Java 程序生成 exe 可执行文件的整个过程,从将 Java 程序生成 Jar 包到使用 exe4j 对 Jar 包进行 exe 封装。
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 ...
编译执行第一个Java程序 教学方法: 比较与比喻教学方式,提高学生的学习兴趣 程序调适,让学生对Java程序获取感性认识,激发兴趣; 适度提问,养成学生勤于思考的学习习惯 教学过程设计: 1.讨论,...