精华内容
下载资源
问答
  • 创建子类对象时会先调用父类的构造函数 。因为子类的static初始化可能会依赖于父类成员能否被正确的初始化,所以需完成父类的初始化(通过自动调用构造函数来完成父类成员属性的实例化和对成员方法的正确初始化) ...
    1. 构造函数也是static方法,只是没有将static方法显性的显示出来。所以更准确来说,类是在其任何static成员被访问时加载。

    2. 创建子类对象时会先调用父类的构造函数 。因为子类的static初始化可能会依赖于父类成员能否被正确的初始化,所以需先完成父类的初始化(通过自动调用构造函数来完成父类成员属性的实例化和对成员方法的正确初始化)

    ①首先,等父类被加载完毕后,对象中所有的基本类型都会被设为默认值,对象引用被设为null–这是通过将对象内存设为二进制零值而一举生成的。
    ②随后,子类的构造器就会被调用,子类构造器完成之后,实例变量按其依次序被初始化
    ③最后,构造器其余部分被执行

    以下借鉴博客园:Java父类调用被子类重写的方法

    如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法(你需要了解java继承中的初始化机制)。
    例子:

    public abstract class Father {
        public Father() {
            display();
        }
     
        public void display() {
            System.out.println("Father's display");
        }    
    }
    
    public class Son extends Father {
     
        public Son() {
        }
     
        public void display() {
            System.out.println("Son's display");
        }
        
        public static void main(String[] args) {
            new Son();
        }
     
    }
    

    输出为:Son’s display

    这种机制有优点,不过有时也存在问题。
    优点: 通过继承相同的父类,初始化子类时,父类会调用不同子类的不同复写方法,从而实现多态性。
    缺点: 如果在父类构造函数中调用被子类重写的方法,会导致子类重写的方法在子类构造器的所有代码之前执行,从而导致子类重写的方法访问不到子类实例变量的值,因为此时这些变量还没有被初始化。

    展开全文
  • java构造函数和静态变量的执行顺序(实例一)   java构造函数和静态变量的执行顺序(实例一)    Java初始化顺序 1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被...

    java构造函数和静态变量的执行顺序(实例一)

     

    java构造函数和静态变量的执行顺序(实例一) 

     



    Java初始化顺序

    1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入);
    2,在装载类时,先装载父类A,再装载子类B
    3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
    4,装载子类B后,完成静态动作。


    类装载完成,开始进行实例化
    1,在实例化子类B时,先要实例化父类A
    2,实例化父类A时,先成员实例化(非静态代码)
    3,父类A的构造方法
    4,子类B的成员实例化(非静态代码)
    5,子类B的构造方法

    先初始化父类的静态代码(包括代码段,静态变量,静态函数

    -->初始化子类的静态代码(包括代码段,静态变量,静态函数)

    -->初始化父类的非静态代码(普通变量,和函数)

    -->初始化父类构造函数

    -->初始化子类非静态代码(普通变量,和函数)

    -->初始化子类构造函数
     

    测试代码:

    abstract class base
    {
    public int age=getNumber(100);
    static{
    System.out.println("base static block");
    }

    {
    System.out.println("base nonstatic block");
    }
    static int sage=getNumber(50);
    base(){
    System.out.println(age);
    System.out.println("base start");
    draw();//会调用子类覆盖后的方法,这儿是0!(方法的重载)
    System.out.println("base end");
    }
    static int getNumber(int base){
    System.out.println("base.getNumber int"+base);
    return base;
    }
    public void draw(){
    System.out.println("base.draw");
    }
    }

    public class initializeOrder extends base{
    public int age=getNumber(1001);
    private int _radius=getNumber(10);
    static int sage=getNumber(250);
    static{
    System.out.println("subclass static block");
    }
    {
    System.out.println("subclass nonstatic block");
    }
    initializeOrder(int radius){
    _radius=radius;
    System.out.println(age);
    draw();//这儿是1000
    System.out.println("initializeOrder initialized");
    }
    public void draw(){
    System.out.println("initializeOrder.draw "+_radius);
    }
    public static void main(String[] args) { // TODO Auto-generated method stub
    new initializeOrder(1000);

    }

    }

    输出为:

    base static block      //父类static 代码块结果
    base.getNumber int50  //父类static 函数结果
    base.getNumber int250  //子类static int sage变量 (里面调用的是继承自父类的getNumer)
    subclass static block   //子类static 代码块结果
    base.getNumber int100  //父类普通变量
    base nonstatic block   //父类非静态代码块结果

    100     
    base start
    initializeOrder.draw 0
    base end
    base.getNumber int1001
    base.getNumber int10
    subclass nonstatic block
    1001
    initializeOrder.draw 1000
    initializeOrder initialized

    展开全文
  • (类只有在使用New调用创建的时候才会被java类装载器装入); 2,在装载类时,装载父类A,再装载子类B 3,装载父类A,完成静态动作(包括静态代码和变量,它们的级别相同的,安装代码中出现的顺序初始化) ...
    Java初始化顺序
    1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入);
    2,在装载类时,先装载父类A,再装载子类B
    3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
    4,装载子类B后,完成静态动作。


    类装载完成,开始进行实例化
    1,在实例化子类B时,先要实例化父类A
    2,实例化父类A时,先成员实例化(非静态代码)
    3,父类A的构造方法
    4,子类B的成员实例化(非静态代码)
    5,子类B的构造方法

    先初始化父类的静态代码(包括代码段,静态变量,静态函数

    -->初始化子类的静态代码(包括代码段,静态变量,静态函数)

    -->初始化父类的非静态代码(普通变量,和函数)

    -->初始化父类构造函数

    -->初始化子类非静态代码(普通变量,和函数)

    -->初始化子类构造函数
      

    测试代码:

    abstract class base
    {
    public int age=getNumber(100);
    static{
    System.out.println("base static block");
    }

    {
    System.out.println("base nonstatic block");
    }
    static int sage=getNumber(50);
    base(){
    System.out.println(age);
    System.out.println("base start");
    draw();//会调用子类覆盖后的方法,这儿是0!(方法的重载)
    System.out.println("base end");
    }
    static int getNumber(int base){
    System.out.println("base.getNumber int"+base);
    return base;
    }
    public void draw(){
    System.out.println("base.draw");
    }
    }

    public class initializeOrder extends base{
    public int age=getNumber(1001);
    private int _radius=getNumber(10);
    static int sage=getNumber(250);
    static{
    System.out.println("subclass static block");
    }
    {
    System.out.println("subclass nonstatic block");
    }
    initializeOrder(int radius){
    _radius=radius;
    System.out.println(age);
    draw();//这儿是1000
    System.out.println("initializeOrder initialized");
    }
    public void draw(){
    System.out.println("initializeOrder.draw "+_radius);
    }
    public static void main(String[] args) { // TODO Auto-generated method stub
    new initializeOrder(1000);

    }

    }

    输出为:

    base static block      //父类static 代码块结果
    base.getNumber int50  //父类static 函数结果
    base.getNumber int250  //子类static int sage变量 (里面调用的是继承自父类的getNumer)
    subclass static block   //子类static 代码块结果
    base.getNumber int100  //父类普通变量
    base nonstatic block   //父类非静态代码块结果

    100      
    base start
    initializeOrder.draw 0
    base end
    base.getNumber int1001
    base.getNumber int10
    subclass nonstatic block
    1001
    initializeOrder.draw 1000
    initializeOrder initialized

    转自http://blog.sina.com.cn/s/blog_60d5c01501013v9h.html
    展开全文
  • java构造函数和静态变量的执行顺序(实例一)    Java初始化顺序 1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入); 2,在装载类时,装载父类A,...

    java构造函数和静态变量的执行顺序(实例一) 

     



    Java初始化顺序

    1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入);
    2,在装载类时,先装载父类A,再装载子类B
    3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
    4,装载子类B后,完成静态动作。


    类装载完成,开始进行实例化
    1,在实例化子类B时,先要实例化父类A
    2,实例化父类A时,先成员实例化(非静态代码)
    3,父类A的构造方法
    4,子类B的成员实例化(非静态代码)
    5,子类B的构造方法

    先初始化父类的静态代码(包括代码段,静态变量,静态函数

    -->初始化子类的静态代码(包括代码段,静态变量,静态函数)

    -->初始化父类的非静态代码(普通变量,和函数)

    -->初始化父类构造函数

    -->初始化子类非静态代码(普通变量,和函数)

    -->初始化子类构造函数
     

    测试代码:

    abstract class base
    {
    public int age=getNumber(100);
    static{
    System.out.println("base static block");
    }

    {
    System.out.println("base nonstatic block");
    }
    static int sage=getNumber(50);
    base(){
    System.out.println(age);
    System.out.println("base start");
    draw();//会调用子类覆盖后的方法,这儿是0!(方法的重载)
    System.out.println("base end");
    }
    static int getNumber(int base){
    System.out.println("base.getNumber int"+base);
    return base;
    }
    public void draw(){
    System.out.println("base.draw");
    }
    }

    public class initializeOrder extends base{
    public int age=getNumber(1001);
    private int _radius=getNumber(10);
    static int sage=getNumber(250);
    static{
    System.out.println("subclass static block");
    }
    {
    System.out.println("subclass nonstatic block");
    }
    initializeOrder(int radius){
    _radius=radius;
    System.out.println(age);
    draw();//这儿是1000
    System.out.println("initializeOrder initialized");
    }
    public void draw(){
    System.out.println("initializeOrder.draw "+_radius);
    }
    public static void main(String[] args) { // TODO Auto-generated method stub
    new initializeOrder(1000);

    }

    }

    输出为:

    base static block      //父类static 代码块结果
    base.getNumber int50  //父类static 函数结果
    base.getNumber int250  //子类static int sage变量 (里面调用的是继承自父类的getNumer)
    subclass static block   //子类static 代码块结果
    base.getNumber int100  //父类普通变量
    base nonstatic block   //父类非静态代码块结果

    100     
    base start
    initializeOrder.draw 0
    base end
    base.getNumber int1001
    base.getNumber int10
    subclass nonstatic block
    1001
    initializeOrder.draw 1000
    initializeOrder initialized
    展开全文
  • 我们来看一下什么构造器:1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器;2、构造器也一种方法,只不过一种特殊的方法,它会在对象创建的时候被调用;3、构造器最大的作用就是在创建对象的...
  • 我们来看一下什么构造器:1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器;2、构造器也一种方法,只不过一种特殊的方法,它会在对象创建的时候被调用;3、构造器最大的作用就是在创建对象的...
  • 我们来看一下什么构造器:1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器;2、构造器也一种方法,只不过一种特殊的方法,它会在对象创建的时候被调用;3、构造器最大的作用就是在创建对象的...
  • 在学习编程的过程中,我觉得不止要获得课本的知识,更多的通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java专业知识,广州疯狂java培训为你讲解;  初始化父类的静态代码--->初始化子...
  • 1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器; 2、构造器也一种方法,只不过一种特殊的方法,它会在对象创建的时候被调用; 3、构造器最大的作用就是在创建对象的时候进行对象的初始化,有参...
  • 我们来看一下什么构造器:1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器;2、构造器也一种方法,只不过一种特殊的方法,它会在对象创建的时候被调用;3、构造器最大的作用就是在创建对象的...
  • (类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,装载父类A,再装载子类B 3,装载父类A,完成静态动作(包括静态代码和变量,它们的级别相同的,安装代码中出现的顺序初始化) 4...
  • Java初始化顺序 1在new B一个实例时首先要进行...2,在装载类时,装载父类A,再装载子类B 3,装载父类A,完成静态动作(包括静态代码和变量,它们的级别相同的,安装代码中出现的顺序初始化) 4,装载子类B...
  • Java对象创建流程

    2020-09-01 16:58:25
    使用new关键字 调用构造函数 使用Class的newInstance方法 调用构造函数 使用Constructor类的newInstance方法 调用构造函数 使用clone方法 没有调用构造函数 使用反序列化 没有调用构造函数 创建流程 虚拟机...
  • (类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,装载父类A,再装载子类B3,装载父类A,完成静态动作(包括静态代码和变量,它们的级别相同的,安装代码中出现的顺序初始化)4,...
  • (类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,装载父类A,再装载子类B3,装载父类A,完成静态动作(包括静态代码和变量,它们的级别相同的,安装代码中出现的顺序初始化)4,装载...
  • (类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,装载父类A,再装载子类B 3,装载父类A,完成静态动作(包括静态代码和变量,它们的级别相同的,安装代码中出现的顺序初始化) 4,...
  • 使其具有特殊功能的代码集注意:方法必须先创建才可以使用,该过程成为方法定义方法创建后并不直接可以运行的,需要手动使用后,才执行,该过程成为方法调用2. 方法的定义和调用2.1 无参数方法定义和调用(掌握)...
  • 学习JAVA这门面向对象的语言,实质就是不断地创建类,并... 2 、如果在类内有静态变量和静态块,就静态非静态,最后才是构造函数; 3 、继承关系中,必须要父类初始化完成,才初始化子类。下面一个例子:编...
  • Java构造函数,也叫构造方法,java中一种特殊的函数,函数名与相同,无返回值,且只运行一次。一般用来初始化成员属性和成员方法的,即new对象产生,就调用了对象了属性和方法。 执行顺序 如下所示,当创建java...
  • 但是在调用start()方法之前,我们需要构建一个Thread对象,一般我们都直接使用Thread类的构造函数创建一个线程对象,Thread构造函数定义如下:public Thread() { init(null, null, "Thread-" + nextTh...
  • 构造方法调用浅谈

    2008-12-10 21:47:18
    在学习JAVA过程中,必须要了解这些基本的东西才能对读代码少些困惑,而这些细节新手必须注意的。 总结:初始化的顺序为:  初始化父类的静态代码--->初始化子类的静态代码-->创建实例时,如果不...
  • 先是父类非静态初始化块,非静态属性 ,再父类构造函数,然后子类非静态初始化块,非静态属性 ,最后子类构造函数 注意 (1)子类在继承父类,若重写了父类的方法,那么父类中这个方法会被隐藏,但是可以...
  • 3、初始化操作,比如将空间初始化为零值,调用构造函数 4、虚拟机堆对象进行必要的设置,比如该对象哪个类的实例、如何才能找到类的元数据信息,对象的GC分代年龄等信息。 为对象分配内存 根据堆内存的规整状态...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 148
精华内容 59
关键字:

java构造函数是先创建后调用

java 订阅