| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2745 人关注过本帖
标题:[求助]一个子类中显示初始化,是在父类完成初始化前还是后
只看楼主 加入收藏
线衣男
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-19
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
[求助]一个子类中显示初始化,是在父类完成初始化前还是后

一个对象实例化过程,以Person p = new Person();为例:

    1. JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下)。

    2. 在内存中开辟空间,并分配地址。

    3. 并在对象空间中,对对象的属性进行默认初始化。

    4. 调用对应的构造函数进行初始化。

    5. 在构造函数中,第一行会先到调用父类中构造函数进行初始化。

    6. 父类初始化完毕后,再对子类的属性进行显示初始化。

    7. 再进行子类构造函数的特定初始化。

    8. 初始化完毕后,将地址值赋值给引用变量。

这是老师最开始讲的,讲的时候没什么感觉跟这就下来了,后来过了好久再回来复习的时候突然感觉又有几个地方看不懂了,还请各位前辈指点一下迷津

                在这之前自己写了段代码试了下,父类中定义个 name,age子类中也定义了一个name,age,结果new一个子类传的空参,打印显示的是子类的name,age
                这是说明是在父类进行完一系列初始化之后再对子类进行显示初始化赋值吗? 还是说我在子类中定义的name,age和父类中定义的name,age不是同一
                个变量


    问题 1:     在第3步  3.并在对象空间中,对对象的属性进行默认初始化。这句话之前我能理解,可第4步调用对应的构造函数.对父类进行一系列初始化之后
                再对子类进行显示初始化赋值,这我就有点懵逼了,在调用对应的构造函数之前,子类不是应该已经完成了显示初始化吗?   正常的步骤不应该是1.  
                默认初始化,2. 显示初始化,3.构造函数初始化吗?   为什么这上面写的是在父类初始化完毕后,再对子类进行显示初始化?
         
         2:     在第7步  7. 再进行子类构造函数的特定初始化。这之前不是已经通过子类的构造函数对父类进行初始化了吗,怎么又再进进行子类构造函数的特定
                初始化...有点懵
搜索更多相关主题的帖子: 空间 
2016-04-19 18:56
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:5 
1:存在继承关系的父子类,子类的对象创建以下面的顺序进行:
父类静态代码块-》子类静态代码块-》父类实例代码块-》父类构造器-》子类构造器
父类对象创建于子类对象前,绕来绕去就先搞清楚运行顺序
2:还是前面说的,父类创建于子类前,那么特定初始化可能指的是构造器重载吧。
个人看法仅供参考

剑栈风樯各苦辛,别时冰雪到时春
2016-04-19 20:45
线衣男
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-19
收藏
得分:0 
回复 2楼 林月儿
恩呢谢谢啦,我这之前的顺序都是背下来的,以为都理解了,
过了好久再回来看下发现还是很多细节都没理解到位
2016-04-19 22:27
Tony_PC
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:12
专家分:56
注 册:2016-4-9
收藏
得分:5 
你自己写的那个,变量名相同,继承会把父类的成员隐藏。
第二个问题。子类实例化的时候总是要先调用父类的构造方法初始化父类空间,如果子类没有显示调用语句,编译器会使用 super(); 隐式调用。当你把super语句写出来,那么super语句之前是不能有任何语句的。如果父类中定义有多个构造方法,应当包括一个不带参数的构造方法,不然当子类省略super时会出现错误。
第三个问题。子类拥有自己的构造方法,他先是用super语句调用父类不带参数的构造方法,完成之后再调用自身的特殊构造方法。着大概就是特定初始化的意思吧。
2016-04-20 22:59
线衣男
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-4-19
收藏
得分:0 
回复 4楼 Tony_PC
哦哦,第一个问题明白呢了,那个子类定义的变量重名的话原来是给父类的覆盖了啊
第三个问题是这个意思吗
class Zi extends Fu{
    public Zi(){
        super();
        System.out.println("子类构造函数的特定初始化");//这一步就相当于是子类构造函数的特定初始化吗?
    }
}

第二个问题我是这个意思
class Zi extends Fu{
    private String name = "哈哈";//这一步不是相当于显示初始化赋值吗?它不是在构造函数初始化之前吗?
                                 //可是上面为什么说是在父类初始化完毕后再对子类进行显示初始化赋值,
                                 //父类进行初始化的时间不是应该在super()访问的时候吗?可这时候子类已经完成了显示初始化啊...就是这没懂
    public Zi(){
        super();
    }
}
2016-04-21 19:33
快速回复:[求助]一个子类中显示初始化,是在父类完成初始化前还是后
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021916 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved