Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 私有变量的变化_Java_Private - Fatal编程技术网

Java 私有变量的变化

Java 私有变量的变化,java,private,Java,Private,几个月后,我开始学习Java课程,我正在尝试制作一个简单版本的口袋妖怪游戏。直到现在一切都很顺利,但现在我有麻烦了 我将带有障碍物的地图存储在数组(private)中的一个类中,并使用get方法在其他类中使用该数组。 不知何故,这些其他类改变了第一个类中的数组 这怎么可能?私有并不意味着它不能变异。Private表示该对象的引用不能使用父对象直接访问。如果您有一个getter并返回对象引用,那么任何具有该实例的对象都可以对其进行变异。是。通过使用反射,您可以访问您的私有字段,而无需提供引用方法。

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

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


这怎么可能?私有并不意味着它不能变异。Private表示该对象的引用不能使用父对象直接访问。如果您有一个getter并返回对象引用,那么任何具有该实例的对象都可以对其进行变异。

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

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);

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


如果看不到代码,就很难说程序中到底发生了什么。也许类似的事情正在发生

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

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();
    }
}
这是因为对象是数组,而
data
x
等变量都引用了同一数组对象-只有一个数组和
data
x
都引用了该数组。如果修改数组,您将通过这两个变量看到更改

如果要避免这种情况,则不应通过在类
示例
中的
getData()
方法中直接返回数组来公开数组。您应该制作阵列的副本:

public int[] getData() {
    // Return a copy of the array
    return Arrays.copyOf(data, data.length);
}

您应该共享代码,以便人们能够帮助您。阅读本文,它解释了Java如何处理对象的传递。您可能还想了解指针和引用。请看一下这一点。如果您使用get()方法提供对数组的访问,那么您就为其他人提供了修改数组的能力。数组是同一个对象,也就是说,它可能被定义在一个地方,但是get()提供了指向同一数组的指针(如果您愿意的话),因此任何指向该数组的人都可以看到对该数组的更新,也就是说,使用对该数组的引用。谢谢,这使它变得清晰。但是我如何访问私有实例而不在getter中提供引用呢?在这里,您要做的是使数组不可变。这可以通过在getter方法中使用Collections.unmodifiableList(Arrays.asList(您的_数组))将其作为不可修改的列表返回来实现。谢谢,问题就在于此。但是,当我尝试使用副本的解决方案时,它仍然会更改原始数组…那么您没有正确创建副本,或者它以其他方式泄漏了。public static int[]clone2D(int[]array){int[]clone=new int[array.length];int i;for(i=0;ipublic int[] getData() { // Return a copy of the array return Arrays.copyOf(data, data.length); }