通过第二和第三类更改类变量

Dan*_*iel 1 java variables class

我正在做一个个人项目,同时试验它.我在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;  
    }  
}
Run Code Online (Sandbox Code Playgroud)

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;  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

最后,在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());  
    }  
}
Run Code Online (Sandbox Code Playgroud)

控制台输出为:"L1:75 L2:75"

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

当我第一次编写这段代码时,我假设c1.figurec2.figure保留了自己独立的值,但它们没有.有没有办法实现这一点(拥有c1.figurec2.figure保持自己的价值而不改变另一个)?

PS:我第一次在这里发帖,如果我弄乱格式化,我会提前道歉.

Bri*_*new 7

public static Geometry figure = new Geometry();
Run Code Online (Sandbox Code Playgroud)

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

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

这是关于实例变量教程部分,值得一读.

  • +1作为`静态`导致问题.请注意,`Geometry`类的长度和宽度也被声明为静态变量,也需要修复(否则在下一级引用时会出现同样的问题). (2认同)