Изменение переменных класса с помощью второго и третьего класса - PullRequest
1 голос
/ 05 октября 2009

Я работаю над личным проектом и в то же время экспериментирую с ним. У меня есть 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 я создаю переменную c1 типа Calculate.

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.figure и c2.figure будут поддерживать свои собственные отдельные значения, но они этого не делают. Есть ли способ добиться этого (пусть c1.figure и c2.figure сохраняют свои собственные значения без изменения других)?

PS: Когда я публикую здесь впервые, заранее прошу прощения, если испортил форматирование.

1 Ответ

7 голосов
/ 05 октября 2009
public static Geometry figure = new Geometry();

создает один объект Geometry независимо от того, сколько у вас Calculate экземпляров. Удалите ключевое слово static (которое обеспечивает один экземпляр для каждого класса), и каждый объект Calculate будет содержать один Geometry.

То же самое относится к вашему area члену и length и width в объекте Geometry. Я не думаю, что в этом сценарии вам требуется где-нибудь статическое (действительно, я редко требую его вообще в небольших проектах).

Вот учебный раздел по переменным экземпляра , который стоит прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...