首页 新闻 搜索 专区 学院

Java:请教这段代码的执行顺序?

0
[已解决问题] 解决于 2017-01-20 20:00
复制代码代码下面有描述
 1 public class App
 2 {
 3     private static App d = new App();
 4 
 5     private SubClass t = new SubClass();
 6     
 7     static
 8     {
 9         System.out.println(3);
10     }
11     
12     public App()
13     {
14         System.out.println(4);
15     }
16     
17     public static void main(String[] args){
18          System.out.println("Hello");
19     }
20 }
21 
22 class SuperClass
23 {
24     SuperClass()
25     {
26          System.out.println("构造superClass");
27     }
28 }
29 
30 class SubClass extends SuperClass
31 {
32     static
33     {
34          System.out.println(1);
35     }
36     
37     public SubClass(){
38          System.out.println(2);
39     }
40 }




在Windows下的cmd中敲下 Java App 时,App类被加载进内存(不知这样描述是否正确),然 后会怎么样执行? 是会执行main方法打印出 Hello(因为main方法是程序的入口)?还是执行
static代码块? 或是会执行 private static App d = new App() ?

当执行 private SubClass t = new SubClass(); 这句时,因为涉及到SubClass类,到这时是不是才会第一次把SubClass类加载进内存?

能否像上面的分析思路一样,将这段代码的执行顺序分析一下,格式可以像下面这样写:
A:当在Windows下的cmd中敲下 Java App 时,App类被加载进内存...此时,静态...
B:当把App类加载进内存后,又会怎么样怎么样...
C:...



复制代码
秋风秋雨123的主页 秋风秋雨123 | 初学一级 | 园豆:51
提问于:2017-01-18 23:44
< >
分享
最佳答案
2

1、说明顺序问题:在Java 中,调用构造方法 new 一个对象时,执行顺序为:

a.调用父类的static 部分

b.调用子类(当前类)中的static 部分

c.调用父类的构造方法(初始化子类中继承于父类属性)

d. 调用子类的构造方法。(初始化子类自身独有的属性)

注:static 部分从上至下执行

 

2、main方法是执行程序的入口,但是只有当前类的static加载完成之后,才执行main方法体内容;

 

3、解题:执行顺序为:

A、当在Windows下的cmd中敲下 Java App 时,App类被加载进内存。此时,

1:执行 private static App d = new App();

new APP()操作流程:
参照new 对象顺序:此时直接执行调用构造器初始化成员变量 private SubClass t
 即 执行 new SubClass();
再次参照 new 对象顺序,此时,先执行 SubClass中的 static 部分即
static { System.out.println("1"); }
接着执行父类构造方法 SuperClass(){System.out.println("构造superClass");}
最后执行子类构造方法 public SubClass(){ System.out.println("2"); }
完成 new SubClass() 流程;
初始化成员变量之后执行构造方法体内容,即: public App() { System.out.println("构造器"); }
到此,完成 new APP()操作;
赋值给 d ;
到此,完成第一个static 加载;

2:执行 static { System.out.println("静态块");}

3:加载完 static 部分后,现在开始执行 main 方法体中的程序,即 {System.out.println("Hello");}

奖励园豆:5
探知我心 | 菜鸟二级 |园豆:209 | 2017-01-19 01:29

 非常非常地感谢,只是下面这句的理解有些模糊:

1:执行 private static App d = new App();

          new APP()操作流程: 
          参照new 对象顺序:此时直接执行调用构造器初始化成员变量 private SubClass t 
        即 执行 new SubClass();

为什么执行 private static App d = new App() 是 直接执行调用构造器初始化成员变量 private SubClass t ,好像两句不挨着啊

秋风秋雨123 | 园豆:51 (初学一级) | 2017-01-19 10:58

@秋风秋雨123: 是我开始没有说清楚,当类(第一次)被加载时,首先加载static ,(这个是在new之前的);加载完成的 static 是存放在独立的内存空间中的;而 new 一个对象的本质,就是给对象的属性初始化,此时已经无关到 static 了,因为static是在第一次加载类的时候加载的;(而外的:static加载过后,是所有new出来的对象共用的)

表达能力有点欠,希望能理解

探知我心 | 园豆:209 (菜鸟二级) | 2017-01-19 13:44

@探知我心: 谢谢,竟然忘记看了。既然执行到  private static App d = new App(); 这一句,为什么不是调用

public App() {System.out.println("4"); }  直接输出4呢 ?

 

秋风秋雨123 | 园豆:51 (初学一级) | 2017-01-19 23:09

@秋风秋雨123: 这其实跟main方法那里是一样的,main方法是程序的执行入口,但是也不是先执行方法体中程序,要先完成加载;构造方法的作用是:new一个对象,开辟空间给对象属性,优先去给属性初始化,而不是执行方法体本身

探知我心 | 园豆:209 (菜鸟二级) | 2017-01-19 23:54

@秋风秋雨123: 构造方法的作用:初始化对象。在调用构造函数之前,系统已初始化该对象。

探知我心 | 园豆:209 (菜鸟二级) | 2017-01-19 23:58

@探知我心: 谢谢了,这是道好题,你的回答非常好,一道题就加深理解了好多混乱的知识

秋风秋雨123 | 园豆:51 (初学一级) | 2017-01-20 20:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册