Java 前一个变量的值变为当前变量的值
我的代码有问题。当我试图通过调用isEqual()方法比较两个不同值的变量时。但它给了我一个真实的结果。有人能发现问题吗? 我的浮点类Java 前一个变量的值变为当前变量的值,java,Java,我的代码有问题。当我试图通过调用isEqual()方法比较两个不同值的变量时。但它给了我一个真实的结果。有人能发现问题吗? 我的浮点类 import io.*; //Class FloatingPoint public class FloatingPoint { //Constant public static final double MINPRECISION = 0.00000001; //Variable private static double
import io.*;
//Class FloatingPoint
public class FloatingPoint
{
//Constant
public static final double MINPRECISION = 0.00000001;
//Variable
private static double precision;
//Default constructor
public FloatingPoint()
{
precision = MINPRECISION;
}
//Unsure if need a alternatve
//Alternative constructor
public FloatingPoint(double value)
{
if( (value < 0.0) || (value > 1.0) )
{
throw new IllegalArgumentException("Invalid reliability!");
}
setPrecision(value);
}
//Copy Constructor
public FloatingPoint(FloatingPoint num)
{
precision = num.getPrecision();
}
//getPrecision
public double getPrecision()
{
return precision;
}
//isEqual
public boolean isEqual(FloatingPoint num)
{
return (Math.abs(precision - num.getPrecision()) < MINPRECISION);
}
//setPrecision
public static void setPrecision(double value)
{
precision = value;
}
}
当我试图通过调用isEqual()方法比较两个不同值的变量时
没有具有不同值的变量,因为只有一个值-静态变量:
private static double precision;
(将setPrecision
的声明也更改为非静态。)
声明为static
意味着它与类型关联,而不是与类型的任何实例关联。您的类没有声明任何实例字段,因此没有任何状态(对象标识除外)
简单的修复方法是将其设置为实例字段:
private double precision;
但是你应该阅读更多关于静态的内容,这样你就可以决定什么时候使用它,什么时候不使用它。将此视为一个起点
当我试图通过调用isEqual()方法比较两个不同值的变量时
没有具有不同值的变量,因为只有一个值-静态变量:
private static double precision;
(将setPrecision
的声明也更改为非静态。)
声明为static
意味着它与类型关联,而不是与类型的任何实例关联。您的类没有声明任何实例字段,因此没有任何状态(对象标识除外)
简单的修复方法是将其设置为实例字段:
private double precision;
但是你应该阅读更多关于静态的内容,这样你就可以决定什么时候使用它,什么时候不使用它。请参阅作为起点。移除静电传感器。静态意味着类型为
FloatingPoint
的所有对象将共享相同的值因此,如果您更改了其中一个,则所有这些选项都将更改。
//Variable
private double precision;
//setPrecision
public void setPrecision(double value)
{
precision = value;
}
还请注意,您可以从非静态
方法调用静态
字段(因为静态
对于同一类的所有对象都是共享的
),但不能在静态
方法中使用非静态
字段(因为没有对象可以从中获取值)。我想如果你有了这个概念,你就能很容易地解决你的问题
FloatingPoint f1, f2;
f1= new FloatingPoint(0.2);
// Here f1 has precision = 0.2
System.out.print(f1.toString());
f2=new FloatingPoint(1.0);
// Here f1 and f2 have precision = 1.0
移除静电传感器。静态意味着类型为
FloatingPoint
的所有对象将共享相同的值因此,如果您更改了其中一个,则所有这些选项都将更改。
//Variable
private double precision;
//setPrecision
public void setPrecision(double value)
{
precision = value;
}
还请注意,您可以从非静态
方法调用静态
字段(因为静态
对于同一类的所有对象都是共享的
),但不能在静态
方法中使用非静态
字段(因为没有对象可以从中获取值)。我想如果你有了这个概念,你就能很容易地解决你的问题
FloatingPoint f1, f2;
f1= new FloatingPoint(0.2);
// Here f1 has precision = 0.2
System.out.print(f1.toString());
f2=new FloatingPoint(1.0);
// Here f1 and f2 have precision = 1.0
您正在将值存储在
precision
中,并且在您的类中没有value
字段。。。你的意图一点也不清楚。私有静态双精度
-我建议你仔细阅读静态变量。您好,但如果我必须使用静态变量精度,还有其他方法解决吗?你将值存储在精度
中,并且在类中没有值
字段。。。你的意图一点也不清楚。私有静态双精度
-我建议你仔细阅读静态变量。您好,但如果我必须使用静态变量精度,还有其他解决方法吗?您好,Jon,但是如果我必须使用静态变量精度和公共静态void setPrecision(双值),还有其他解决方法吗?@Auric:是的,你也需要让这个方法成为非静态的。想想看——如果你调用FloatingPoint.setPrecision(5.0)
你想让它影响哪个对象?嗨,乔恩,你的意思是删除static这个词吗?但是如果我想让这个方法保持static这个词,我应该添加另一个私有变量来比较吗?@Auric:那么你应该认真考虑一下你实际上想要实现什么。你为什么想要一个类型范围的可变状态和一个每个实例的可变状态?嗨,Jon,但是如果我必须使用静态变量精度和公共静态void setPrecision(双值),还有其他解决方法吗?@Auric:是的,你也需要使该方法非静态。想想看——如果你调用FloatingPoint.setPrecision(5.0)
你想让它影响哪个对象?嗨,乔恩,你的意思是删除static这个词吗?但是如果我想让这个方法保持static这个词,我应该添加另一个私有变量来比较吗?@Auric:那么你应该认真考虑一下你实际上想要实现什么。为什么您需要一个类型范围的可变状态和一个每个实例的可变状态?您好,是的,实际上我知道如果我删除了static,一切都会正确,但是我必须使用static作为setPrecision和variable precision检查编辑过的答案,如果您更改了f2
的精度,它也将更改为f1
,因为它是静态的
。您还需要从precision variable
和setPrecision
中删除static。我尽量避免“所有对象”作为一个概念共享一个值,因为不必有任何对象。我只是将它建模为“变量与类型相关联,而不是与类型的任何一个实例相关联”。你完全正确,Jon,但我认为新手更容易以这种方式理解它。每个静态字段都有一个副本,每个人都可以访问(因此他们共享该字段)。@user3185569:仅以与所有字符串共享该字段相同的方式。我认为最好避免给人一种误导性的印象(它是在一个对象池中共享的,而不是完全独立的)