初始化复数JAVA

问题描述:

我想请问,我该怎么initiallize最终场1和0,如果我想他们使用加法和乘法中性元素,如在环初始化复数JAVA

他们必须costantly

enter image description here

public class ComplexNumber { 


/**Constant for multiplication. Value 1*/ 
//public final ComplexNumber ONE; 
/**Constant for addition. Value 0 */ 
//public final ComplexNumber ZERO; 
/**The real value of ComplexNumber! FINAL*/ 
private final double a; 
/**The imaginary value of ComplexNumber! FINAL*/ 
private final double b; 

/** 
* This Constructor initializes real and imaginary values of ComplexNumber 
* @param a double real value 
* @param b double imaginary value 
*/ 
ComplexNumber(double a, double b) { 
    this.a = a; 
    this.b = b; 
    //this.ONE = new ComplexNumber(1,0); //TODO ask 
// this.ZERO = new ComplexNumber(0); 
} 
/** 
* This Constructor initializes imaginary value of CompexNumber 
* @param b double imaginary value 
*/ 
ComplexNumber(double b){ 
    this.a = 0; 
    this.b = b; 
    //this.ONE = new ComplexNumber(1,0); //TODO ask 
// this.ZERO = new ComplexNumber(0); 
} 

谢谢!

如果你想从他们的常量,声明并初始化它们是这样的:

public static final ComplexNumber ONE = new ComplexNumber(1, 0); 
public static final ComplexNumber ZERO = new ComplexNumber(0, 0); 

static表示该字段是特定类的,而不是特定实例。 final表示该参考不能被重新分配。对于一个真正的常量,这个实例也必须是不可变的,我认为你的代码在ab之外不能从你的课程以外访问。

+0

谢谢!它的工作 –

+0

但我不喜欢静态在这种情况下,因为如果我没有任何对象,我不会需要常量!还是我不对? 但没有静态我有*异常 –

+0

@DmitrySavkin如果你从不使用类,你将不会实例化常量。第一次使用该类时,静态字段将被初始化。无论如何,这是一个常量,所以你应该声明它是静态的。当您在ComplexNumber的构造过程中实例化ComplexNumber时,*Exception是正常的,因此您正在进行递归调用,该调用越来越深,没有转折点。 – Timmos

constructor是初始化Java中的final变量的方法。

因为最终只能初始化一次它的生命周期,你不能重新初始化它。

所以,使用参数调用构造函数是初始化的最佳方式。

+0

当我将它们初始化为构造函数时,会出现*Exception! '代码' 公共类ComplexNumber { \t/**恒为乘法。值1 */ \t public final ComplexNumber ONE; \t/**添加的常量。值0 */ \t public static final ComplexNumber ZERO = new ComplexNumber(0,0); \t \t \t/** ComplexNumber的实际值! FINAL */ \t private final double a; \t \t \t/** ComplexNumber的虚数值! FINAL */ \t private final double b; \t ComplexNumber(double a,double b){ \t \t this.a = a; \t \t this.b = b; \t \t this.ONE = new ComplexNumber(1,0); \t \t \t \t} –

public class ComplexNumber { 
     final double realPart; 
     final double imgPart; 

     public static final ComplexNumber REAL_ONE = new ComplexNumber(1, 0); 
     public static final ComplexNumber ZERO = new ComplexNumber(0, 0); 

     public ComplexNumber(double realPart, double imgPart) { 
      this.realPart = realPart; 
      this.imgPart = imgPart; 
     } 

     public ComplexNumber(double imgPart) { 
      this(0, imgPart); 
     } 
    } 

为了使您的代码可读,您可以将您的字段名称重命名为real和img部分。
并使用构造函数链,以便可以重用现有的构造函数。

编辑

public class ComplexNumber { 
     final double realPart; 
     final double imgPart; 

     public static final ComplexNumber REAL_ONE = new ComplexNumber(1, 0); 
     public static final ComplexNumber ZERO = new ComplexNumber(0, 0); 

     public ComplexNumber(double realPart, double imgPart) { 
      this.realPart = realPart; 
      this.imgPart = imgPart; 
     } 

     public static ComplexNumber createRealComplexNumber(double realPart) { 
      return new ComplexNumber(realPart, 0.0); 
     } 

     public static ComplexNumber createImgComplexNumber(double imgPart) { 
      return new ComplexNumber(0.0, imgPart); 
     } 
    } 

如果你想创建一个只实部的复数,你就不能过载构造函数,只有真正的一部分,因为相同的签名已被用过的。您可以使用此方法

+0

谢谢!它的工作原理 –

+0

使用@Timmos建议的方法初始化REAL_ONE&ZERO。在其上添加可读性和构造器链接 –