首页 > JAVA > All About JAVA 关于JAVA对象的创建以及构造方法(2)

All About JAVA 关于JAVA对象的创建以及构造方法(2)

      如果一个类A继承自另一个类B,当创建这个A类的对象时,构造函数是怎样运作的? 我们知道一个类继承了另一个类后,这个类会包含父类的所有的实例变量和方法。也包括父类中的private实例变量,虽然在子类中无法直接访问父类中标记为private类型的实例变量,但是仍然可以通过父类中定义的GETTER与SETTER来进行操作。并且继承自父类的一些其他方法也有可能会用到父类中的一些实例变量,如果父类中的实例变量没有进行初始化,很可能进行A的初始化时会遇到问题,所以在我们初始化A类对象之前应该先对B类(父类)进行初始化。

public class Animal {
    public Animal() {
         System.out.println("I am making a new Animal");
    }
}

public class Dog extends Animal {
    public Dog() {
         System.out.println ("I am making a new Dog");
    }
}

public class TestDog {
    public static void main(String[] args) {
        System.out.println("I am Starting");
        Dog d = new Dog();
    }
} // 这段代码,当我们运行了 TestDog 类后 正确的输出应该为
  // I am Starting
  // I am making a new Animal
  // I am making a new Dog

      可以看出,当我们创建Dog对象时首先完成了Animal类的构造方法,最后才完成了Dog类的构造方法,可以用栈来理解这个构造方法的调用,当我们new 一个 Dog 时,Dog()构造方法被压入栈中,随后Animal()构造方法被压入栈中,实际上JAVA中所有类都继承自Object,所以Object()构造方法也被压入栈中,也就是栈的最顶层。然后首先完成了Object()构造方法,Object()从栈中弹出,再完成了Animal()构造方法并从栈中弹出,最后完成了Dog()构造方法并从栈中弹出,至此Dog对象的创建工作才算完成。
      通过以上代码及输出可以看到,在Dog的构造函数运行时自动调用了它的父类Animal类的构造方法,而Animal构造方法实际上自动调用了Object类的构造方法。因为实际上JVM在我们每个构造方法的第一行添加了 super(); 这行语句。它的作用就是调用父类的构造方法,当然我们也可以手动调用super(),比如当父类的构造方法带有参数时,我们可以使用super(xx, xx);在子类的构造方法中调用父类的构造方法,但是需要注意super()语句需要放在子类构造方法的第一行进行调用,否则会报错。一旦我们自己手动调用了super() JVM将不再自动为我们添加 super() 的调用。
      另外如果我有两个或多个构造方法,当一个A构造方法只是对另一个B构造方法额外添加了一些处理,我们可能会想到代码重用,我们可以在A构造方法中使用this(); 来调用B构造方法实现代码重用。例如:

      public class Dog {
            int height;
      
            public Dog() {
                 this(40);
                 // 这里还可以做一些其他初始化处理
                 // ******  我们需要注意,this 也必须放在构造方法中的第一行,还记得之前谈到 super(); 也是要求放在第一行的,
                 // 所以 this(); 和 super(); 是不能同时使用的 ****************************************************************
             }
            public Dog( int newHeight ) {
                 height = newHeight;
            } 
      }

Advertisements
分类:JAVA
  1. 还没有评论。
  1. No trackbacks yet.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: