初始化顺序(InitTest.java)

构造函数适用于对象初始化的,建立对象时会立即执行构造函数(constructor),如果没有定义构造函数,系统会自动生成一个默认的构造函数并执行。除了在构造函数中初始化建立对象时还可以直接对成员变量进行初始化。

(1)编译和运行InitTest.java,并根据程序和运行结果说明下面建立对象的初始化顺序:

运行代码如下:

class Shape{
  String color = "black";
  Shape(){
    System.out.println("基类无参构造函数(成员变量已初始化):Shape color is "+color);
  }
  Shape(String color){
    this.color = color;
    System.out.println("基类有参构造函数(成员变量已初始化):Shape color is " + color);
  }
  void draw(){
    System.out.println("基类的draw()函数:Shape is drawn! ");
  }
}

class Circle extends Shape{
  int radius=10;
  double area;
  {                            // 用块(block)进行初始化
    area = Math.PI * radius * radius;
	System.out.println("子类的块初始化");
   }
  Circle(String color){
    //super(color);              // 调用基类构造器(有参数)
    System.out.println("子类的有参构造函数(成员变量已初始化):Radius = " 
                      + radius + " 快内的初始化:Area = " + area);
  }  
 
  void draw(){
    //super.draw();		// super用于调用基类的同名方法
    System.out.println("子类的darw()函数:Circle is drawn!");
  }
}

public class InitTest {
  InitTest(){
     Circle circle = new Circle("red");
     circle.draw();
  }
  public static void main(String[] args){
     InitTest init = new InitTest();
     System.out.println("finish!");        
  }
}



运行结果如下:

基类无参构造函数(成员变量已初始化):Shape color is black
子类的块初始化
子类的有参构造函数(成员变量已初始化):Radius = 10 快内的初始化:Area = 314.1592653589793
子类的darw()函数:Circle is drawn!
finish!



说明初始化顺序为:

基类直接执行变量初始化

 基类构造函数

导出类的块初始化

导出类直接执行变量初始化

导出类构造函数

(2)super用于调用基类的方法或成员变量。依次去掉两个super的注释,编译执行后通过观察结果,说明它们的功能和增加第一个super引起变化。

Super的作用是能够提供继承的子类,通过它去调用其基类的构造函数或者方法。

去除第一个super的注释前后:

基类有参构造函数(成员变量已初始化):Shape color is red
子类的块初始化
子类的有参构造函数(成员变量已初始化):Radius = 10 快内的初始化:Area = 314.1592653589793
子类的darw()函数:Circle is drawn!
finish!

可以看到,调用了基类的有参构造函数,color变成了黑色

去除第二个super的注释前后变化:

基类有参构造函数(成员变量已初始化):Shape color is red
子类的块初始化
子类的有参构造函数(成员变量已初始化):Radius = 10 快内的初始化:Area = 314.1592653589793
基类的draw()函数:Shape is drawn!
子类的darw()函数:Circle is drawn!
finish!

调用了基类的draw()函数。