黑马程序员技术交流社区

标题: 关于子类与父类创建的问题 [打印本页]

作者: 李泽巍    时间: 2012-9-20 22:20
标题: 关于子类与父类创建的问题
本帖最后由 李泽巍 于 2012-9-20 22:25 编辑
  1. class Father {
  2.     static{
  3.         System.out.println("Father static");
  4.     }

  5.     public Father(){
  6.         System.out.println("Father create");
  7.     }
  8. }
  9. class Child extends Father{
  10.     static{
  11.         System.out.println("Child static");
  12.     }

  13.     public Child(){
  14.         System.out.println("Child create");
  15.     }
  16. }
复制代码
像这样的两个类,当调用Father f = new Child();的时候是怎样的结果?主要想知道具体的执行顺序,这时候创建的Father实例f是否会运行Father的静态块呢
作者: 李泽巍    时间: 2012-9-20 22:46
吕书凯 发表于 2012-9-20 22:35
如果创建父类引用并指向子类对象,则代码如下:
class Father
{

这个Father static的来源是Father f还是new Child()呢?
作者: 王小闲7    时间: 2012-9-20 22:53
关于这个问题你可以百度下java中的static,如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象,所以先打印Father static和Child static,和Child类继承了Father类,所以在Child()构造方法前是先调用Father()构造方法,事实上所有我们写的类的构造方法中都要先写父类的构造方法即Object()构造方法。就是这样了
作者: 皮卫凯    时间: 2012-9-20 22:56
本帖最后由 皮卫凯 于 2012-9-20 23:07 编辑

01.class Father {

02.    static{                                                     //这是一个静态代码块,它的作用是给类初始化的,随着类的加载而加载。
                                                                       //意思是Father类在的时候,它就存在,也就是对象还没建立,它就存在了
03.        System.out.println("Father static");    // 所以它会优先执行。

04.             }

05.

06.    public Father(){                                     //这个是构造方法。调用它的时候,才执行。不调用就不执行。
                                                                      //如果子类对象建立的时候,就后调用到此构造方法,
07.        System.out.println("Father create"); //所以子类对象建立的时,这里会执行打印

08.    }

09.}

10.class Child extends Father{                         //这是子继承父,先要到执行到父类,再执行子类。

11.    static{                                                       //Child类的静态代码块,给Child类初始化,随Child类加载而加载。

12.        System.out.println("Child static");

13.    }

14.

15.    public Child(){                                          //这是构造方法,调用时才执行,不调用就不执行。
                                                                        //建立Child类的对象时,则调用该方法。
16.        System.out.println("Child create");     

17.    }

public static void main(String[] agurs)
    {
            Father f = new Child();
    }

//结果是:Father static
                 Child static
                 Father create
                 Child create

作者: yangfengxiao    时间: 2012-9-20 23:25
我同意一楼的看法,我的理解我一楼的理解一样,但是static 语句和static代码块一般很少使用,因为它的生命周期最长。
如果创建父类引用并指向子类对象,则代码如下:
class Father
{
    static
    {
        System.out.println("Father static");
    }

    public Father(){
        System.out.println("Father create");
    }
}
class Child extends Father
{
    static
    {
        System.out.println("Child static");
    }

    public Child()
    {
        System.out.println("Child create");
    }
    public static void main(String[] agurs)
    {
            Father f = new Child();
    }
}
代码运行结果如下:

Father static
Child static
Father create
Child create
从结果来看,由于静态代码块随着类的加载而最先加载,所以创建父类引用指向子类对象时
首先运行父类静态代码块并打印,然后是子类静态代码块运行。
之后就是构造方法的加载,首先加载父类的构造方法并打印结果
最后执行子类的构造方法。
总之:静态代码块在类加载时就加载,优先于构造方法,并且优先加载父类的静态代码块和父类的构造方法





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