需要知道在程序中调用构造函数的顺序

时间:2011-07-31 14:43:28

标签: java constructor

我需要知道调用构造函数的顺序。

点类:

public class Point
{
    public int x = 0;
    public int y = 0;

    // a constructor!
    public Point(int a, int b) {
        x = a;
        y = b;
    }
} 

矩形类:

public class Rectangle
{
    public int width = 0;
    public int height = 0;
    public Point origin;

    // four constructors
    public Rectangle() {
        origin = new Point(0, 0);
    }
    public Rectangle(Point p) {
        origin = p;
    }
    public Rectangle(int w, int h) {
        origin = new Point(0, 0);
        width = w;
        height = h;
    }
    public Rectangle(Point p, int w, int h) {
       origin = p;
       width = w;
       height = h;
    }

    // a method for moving the rectangle
    public void move(int x, int y) {
        origin.x = x;
        origin.y = y;
    }

    // a method for computing the area of the rectangle
    public int getArea() {
        return width * height;
    }
}

创建对象的类:

public class CreateObjectDemo {
    public static void main(String[] args) {

        //Declare and create a point object
        //and two rectangle objects.
        Point originOne = new Point(23, 94);
        Rectangle rectOne = new Rectangle(originOne, 100, 200);
        Rectangle rectTwo = new Rectangle(50, 100);
        System.out.println("Width of rectOne: " +  rectOne.width);
        System.out.println("Height of rectOne: " + rectOne.height);
        System.out.println("Area of rectOne: " + rectOne.getArea());

        rectTwo.origin = originOne;
    }
}
  1. 类Rectangle中的构造函数以哪种顺序调用?

  2. 何时会调用public Rectangle(Point p)

  3. 声明rectTwo.origin = originOne做了什么?

  4. 该程序来自Oracle的Java Tutorial站点。

4 个答案:

答案 0 :(得分:2)

  1. 此程序中调用的所有构造函数都按以下顺序完成:

    Point(int x, int y)
    Rectangle(Point p, int w, int h)
    Rectangle(int w, int h)
    Point(int x, int y) // (called by Rectangle)
    
  2. 到目前为止,它在任何地方都没有被调用。
  3. 这使得rectTwo的“origin”等于originOne所代表的原点

答案 1 :(得分:2)

  1. 构造函数调用:
    Point(int,int)
    矩形(Point,int,int)
    Rectangle(int,int)
    Point(int,int)

  2. 永远不会调用Rectangle(Point)。

  3. 该声明将rectTwo的来源设为originOne

答案 2 :(得分:1)

1。)每个2实例化只调用一个构造函数。基于main方法的订单:

public Rectangle(Point p, int w, int h)
public Rectangle(int w, int h)

2。)从不。

3.。)将origin对象的rectTwo字段更改为originOne,以便Point rectTwo.origin现在(23,94)而不是(0.0)。

答案 3 :(得分:1)

通常,控制流程按程序顺序(即从左到右),但以下情况除外:

  • 在方法/构造函数本身之前评估方法和构造函数的参数
  • 程序以main方法开头。

因此我们有以下顺序:

  1. Point originOne = new Point(23, 94); - 这将调用Point构造函数。
  2. Rectangle rectOne = new Rectangle(originOne, 100, 200); - 这将使用Point和两个Rectangle参数调用int构造函数。
  3. Rectangle rectTwo = new Rectangle(50, 100); - 这将使用两个Rectangle参数调用int构造函数。

    1. 此构造函数将在origin = new Point(0, 0);中调用Point构造函数。
  4. 没有更明确的构造函数调用。但是这些调用中的每一个都包括在开始时对其超类的构造函数(这里是Object)的隐式调用。

    似乎没有调用构造函数Rectangle(Point)

    rectTwo.origin = originOne;将第二个矩形的原点从(0,0)更改为rectOne使用的相同点,例如(23,94)。