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