【问题标题】:Changing class variables by means of a second and third class通过第二类和第三类改变类变量
【发布时间】:2009-10-05 12:49:03
【问题描述】:

我正在做一个个人项目,同时也在试验它。我在 3 个文件中包含 3 个类:Calculate.java、Geometry.java 和 Test.java。

到目前为止,Geometry.java 仅包含一些我想使用的变量,get/set 方法以及构造方法。

package project;  
public class Geometry {  
    public static double length, width;  
    public Geometry() {  
        this.setLength(20);  
        this.setWidth(30);  
    }  
    public void setLength(double length){  
        this.length = length;  
    }  
    public void setWidth(double width){  
        this.width = width;  
    }  
    public double getLength(){  
        return this.length;  
    }  
    public double getWidth(){  
        return this.width;  
    }  
}

Calculate.java 有一个 Geometry 类型的公共变量和一个处理我在 Geometry.java 中创建的变量的方法。

package project;  
import project.Geometry;  
public class Calculate {  
    public static Geometry figure = new Geometry();  
    public static double area;  
    public void calcArea(){  
        this.area = figure.getLength() * figure.getWidth();  
    }  
    public double getArea(){  
        return this.area;  
    }  
}  

最后,在 Test.java 中,我创建了一个 Calculate 类型的变量 c1。

package project;  
import project.Calculate;  
public class Test{  
    public static void main(String[] args){  
        Calculate c1 = new Calculate;  
        Calculate c2 = new Calculate;  
        c1.figure.setLength(55);  
        c2.figure.setLength(75);  
        System.out.println("L1: "+c1.figure.getLength()+" L2: "+c2.figure.getLength());  
    }  
}

控制台输出为:“L1: 75 L2: 75”

我对输出的解释是 c1.figure 和 c2.figure 正在将数据写入内存中的同一空间,因此,当我调用 c2.figure.setLength(75) 时,它也改变了 c1.figure.length

当我第一次编写这段代码时,我假设c1.figurec2.figure 会保持各自独立的值,但事实并非如此。有没有办法实现这一点(让c1.figurec2.figure 保持自己的价值观而不改变另一个)?

PS:我第一次在这里发帖,如果我搞砸了格式,我提前道歉。

【问题讨论】:

    标签: java class variables


    【解决方案1】:
    public static Geometry figure = new Geometry();
    

    创建一个 Geometry 对象,无论您有多少Calculate 实例。删除 static 关键字(强制每个类一个实例),每个 Calculate 对象将包含一个 Geometry

    这同样适用于您的 area 成员,以及 Geometry 对象中的 lengthwidth。我认为在这种情况下,您在任何地方都不需要静态(事实上,在小型项目中我很少需要它)。

    这里是tutorial section on instance variables,值得一读。

    【讨论】:

    • +1 as static 导致了问题。请注意,Geometry 类的长度和宽度也声明为静态变量,这也需要修复(否则下一级引用会出现同样的问题)。
    • @Brian Agnew - 感谢您的及时回答。我已经进行了修改,一切都按预期工作。感谢您的链接,我会在继续编码之前阅读它。
    • @dtsazza - 感谢格式编辑和对静态问题的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2019-01-13
    • 2014-05-19
    相关资源
    最近更新 更多