Java构造函数重载bug?

时间:2016-12-01 02:58:44

标签: java constructor this overloading

我正在练习java并试图了解这是一个bug还是故意: 在尝试了解浅层复制和硬拷贝+静态类成员+重载构造函数+在构造函数中使用this之间的差异时,我偶然发现了一些我并不真正理解的东西我已经将这些代码放在网格上而有些事情并没有加起来:

package com.example.java;

import java.awt.*;

public class Test {

    Line line;

    public Test() {
        line = new Line(100, 100, 200, 200);
        line.draw();
    }

    public static void main(String[] args) {
        Test shapes = new Test();
        Line line = new Line();
        System.out.println("totalLines in app: " + line.count);
    }
}

class Line {

    private Point p1, p2;
    static int count = 0;

    Line(){
        this(new Line(0, 0, 0, 0));
    }

    Line(int x1, int y1, int x2, int y2) {
        p1 = new Point(x1, y1);
        p2 = new Point(x2, y2);
        count++;
    }

    Line(Line l1) {
        p1 = l1.p1;
        p2 = l1.p2;
        count++;
    }

    void draw() {
        System.out.println("Line p1= " + p1 + "\t,p2= " + p2);
    }
} 

问题是:当我拨打下一​​行的计数行号时 System.out.println("totalLines in app: " + line.count);
我得到3线计数而不是2。 因为我现在正在学习java,所以我在intelliJ上运行调试器,显然对于没有参数的Line构造函数有一个双重调用。 Line line = new Line();
这个构造函数似乎运行了两次就行了 this(new Line(0, 0, 0, 0));我和我正在打破它。谁有人向我解释这里发生了什么? 也许重载构造函数毕竟不是那么健康,如果你不知道如何实现它,那么就会超载不必要的对象和垃圾?

2 个答案:

答案 0 :(得分:1)

  1. line = new Line(100,100,200,200);
  2. this(新行(0,0,0,0));
  3. (新行(0,0,0,0));
  4. 应该是this(0, 0, 0, 0);

答案 1 :(得分:0)

(CASE component WHEN 'component1' THEN 'background: #ff5733;' WHEN 'component2' THEN 'background: #3339ff;' WHEN 'component3' THEN 'background: #e9ff33;' END) AS __style__, 表示你将一个参数作为this(new Line(0, 0, 0, 0));类的新对象及其参数化构造函数。

Line表示您只在this(0, 0, 0, 0);首选的构造函数中放置值,在您的代码中,this代表类this。所以这应该有效,而不是你做的第一次。