改变私人变量

时间:2015-05-07 17:18:20

标签: java private

几个月后我开始学习Java课程,而我正试图制作一个简单版的口袋妖怪游戏。到现在为止一切都很顺利,但现在我遇到了麻烦。

我的地图中包含存储在数组(私有)中的类的障碍,并使用get方法在其他类中使用该数组。 不知何故,这些其他类在第一个类中更改了数组。

这怎么可能?

4 个答案:

答案 0 :(得分:6)

私人并不意味着它不会发生变异。私有意味着该对象的引用无法使用父对象直接访问。如果你有一个getter和哪个返回对象引用,那么拥有该实例的任何对象都可以改变它。

答案 1 :(得分:2)

private并不意味着你无法改变特定事物的价值。当你将变量设为私有时,它不能直接访问类外。这意味着您无法再访问类如下的私有变量

class A{
    private int x = 10;
}

class B{
    public void m(){
         A a = new A();
         a.x = 20; // This is a compile error. Because x is not visible to outside of class A
    }
}

虽然您仍然可以通过公共方法访问变量。这就是我们通常所说的封装。 e.g。

class A{
    private int x = 10;
    public int getX(){
        return x;
    }
    public void setX(int val){
        x = val;
    }
}

class B{
    public void m(){
         A a = new A();
         a.setX(20); 
    }
}

答案 2 :(得分:1)

是。通过使用反射,您可以访问您的私人字段,而无需提供参考方法。
例如:

Field field = YourClass.class.getDeclaredField("fieldName");
field.setAccessible(true); // Force to access the field
// Set value
field.set(yourClassInstance, "Something");
// Get value
Object value = field.get(yourClassInstance);

答案 3 :(得分:0)

如果没有看到您的代码,很难说您的程序到底发生了什么。也许会发生以下情况。

也许你的类有一个方法可以返回一个可变的私有成员。当您执行此操作,并且其他一些类调用此方法时,它将能够更改私有成员变量引用的对象的内容。这是一个例子:

import java.util.Arrays;

class Example {

    // Private member variable
    private int[] data = { 1, 2, 3 };

    // Method that returns the private member variable
    public int[] getData() {
        return data;
    }

    public void showData() {
        System.out.println(Arrays.toString(data));
    }
}

public class Main {
    public static void main(String[] args) {
        Example example = new Example();

        // Prints: [1, 2, 3]
        example.showData();

        // Get the array
        int[] x = example.getData();

        // We can modify the array here!
        x[0] = 4;

        // Prints: [4, 2, 3]
        example.showData();
    }
}

这是因为对象是数组,而datax之类的变量是引用到同一个数组对象 - 只有一个数组和datax都引用那个数组。如果修改数组,您将看到两个变量的变化。

如果你想避免这种情况,那么你不应该直接在类getData()的{​​{1}}方法中返回它来公开数组。你应该复制一个数组:

Example