【问题标题】:Using an object as a variable for a constructor使用对象作为构造函数的变量
【发布时间】:2012-01-07 03:02:06
【问题描述】:

我有一个关于在构造函数中使用对象作为变量的问题。这可能很简单,但我真的想不出该怎么做,而且我的 Java 书并没有真正的帮助。说我想这样做

Fraction f3 = new Fraction(1, 2);
Fraction f5 = new Fraction(f3);

我的第一个对象的构造函数是:

public Fraction(int n, int d)

{
    if (d == 0)
    {
        numerator = 0;
        denominator = 1;
        System.err.println("Error: Invalid Denominator (" + d + ")");
    }
    else if (d < 0)
    {
        int nn = Math.abs(n) * (-1);
        numerator = nn;
        denominator = Math.abs(d);
    }
    else
    {
    numerator = n;
    denominator = d;
    }

}

我的第二个对象的构造函数是这样的:

public Fraction(Fraction f) 

{

}

我想不出如何定义构造函数来让它设置一个新对象作为给定的对象。如果有人能帮我一把,或者给我一些建议,让我走上解决这个问题的道路,我将不胜感激。

【问题讨论】:

  • 如果n=-1,d=-1,分子设置为-1,分母设置为1,是不是故意的?请注意,Math.abs 除了测试“argumentd<0,你调用Math.abs(d),为什么不写-d

标签: java object constructor


【解决方案1】:
public Fraction(Fraction f){
  this(f.numerator, f.denominator);
}

【讨论】:

    【解决方案2】:

    我会使用“构造函数链接”来确保对其中一个所做的更改会反映在另一个中。

    // copy constructor
    public Fraction(Fraction f) {
        this(f.numerator, f.denominator); // call the regular constructor with f's params
    }
    

    【讨论】:

      【解决方案3】:
      public Fraction(Fraction f){
        this.n = f.n;
        this.d = f.d;
      }
      

      【讨论】:

      • 当然,这里假设“分子”和“分母”被定义为 Fraction 的公共成员
      • 我不建议这样做 - 如果逻辑发生变化,您很快就会发现错误。
      • @TravelingTechGuy 不,因为您在文件中。您可以完全访问同一类的成员,即使他们不是 this 对象的成员。
      • @Traveling Tech Guy。不,因为构造函数在 Fraction 内部,所以它可以看到所有可见性的成员。
      • 谢谢。它工作得很好。我已经为分子和分母设置了实例变量。
      【解决方案4】:

      你想要这样的东西

      Fraction a = .... ;
      Fraction b = new Fraction(a);
      System.out.println(a==b);
      

      打印true?这在 Java 中是不可能的; new 总是生成一个新的对象,该对象与所有先前存在的对象分开。

      (这与 ECMAScript 形成对比,ECMAScript 允许构造函数返回现有对象并丢弃运行时创建并作为构造函数的this 传递的新对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        • 2016-10-18
        • 2015-10-08
        相关资源
        最近更新 更多