黑马程序员技术交流社区

标题: 子类实例化过程? [打印本页]

作者: 午夜b'Boy    时间: 2014-2-23 22:25
标题: 子类实例化过程?
如题所问!实例化的流程,及子父类字节码加载情况?
作者: 张东健    时间: 2014-2-24 00:28
这个老毕讲的很清楚了,建议会看视频
作者: 疲劳的小马    时间: 2014-2-24 02:02
本帖最后由 疲劳的小马 于 2014-2-24 02:05 编辑

先给你看个我自己写的代码:class A
{
        static
        {
                System.out.println("A的静态代码块");
        }

        {
                System.out.println("A的构造代码块");
        }

        A()
        {
                System.out.println("A的构造函数");
        }
}
class B extends A
{
        static
        {
                System.out.println("B的静态代码块");
        }

        {
                System.out.println("B的构造代码块");
        }

        B()
        {
                System.out.println("B的构造函数");
        }
}
class Demo
{
        public static void main(String[] args)
        {
                B b=new B();
        }
}
/*运行结果
A的静态代码块
B的静态代码块
A的构造代码块
A的构造函数
B的构造代码块
B的构造函数
*/
如果B继承A,AB都有静态代码块,也有构造代码块,那么初始化的顺序肯定是:先执行A的静态代码块,然后B的静态代码块,然后A的构造代码块,A的构造函数方法,然后B的构造代码块,B的构造函数方法。即先初始化父类的,然后初始化子类的。



作者: 张继鲁    时间: 2014-2-24 10:58
如果子父类中出现非私有的同名变量时
      子类要访问本类中的变量,用this

      super的使用和this的使用几乎一致。
      this代表的是本类对象的引用。
      super代表的是父类对象的引用。
子类的所有的构造函数,默认都会访问父类中空参数。
     因为子类每一个构造函数的第一行都有一句隐式super()
     当父类中没有空参数的构造函数是,子类必须手动通过super语句形式来指定要访问父类中的构造函数。

     当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
           子类中至少会有一个构造函数会访问父类的构造函数。
作者: 丶小天    时间: 2014-2-24 16:36
用类的定义来创建一个实例,就叫做类的实例化。
实例化过程就是调用类的构造函数,完成该实例的数据分配
下面找到一张图:

作者: xiaochen33520    时间: 2014-2-24 17:10
子类实例化过程中,会先调用父类的构造函数,因为子类在实例化之前会看看父类是怎么实例化的。具体的实例化过程是:
子类构造函数调用super();这个super()就是父类构造函数,所有子类的构造函数第一行会隐式的定义super();
根据super()构造函数参数个数与类型来决定调用哪个父类的构造函数.等父类构造函数执行完毕后在返回子类的构造函数中执行完子类的构造函数.
作者: 浅一蓝    时间: 2014-2-25 08:19
1.分配成员变量的存储空间并进行默认的初始化,就是用new关键字产生对象后,对类中的成员变量进行初始化赋值。

2.绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方法中的形式参数变量。

3.如果有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程),被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳到步骤6执行。

4.显示或隐式追溯调用父类的构造方法(一直到Object)类为止,Object是所有Java类的最顶层父类,父类的构造方法又从步骤2开始对父类执行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继续往下执行。

5.进行实例变量的显示初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句。

6.执行当前构造方法的方法体中的程序代码。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2