几个月后我开始学习Java课程,而我正试图制作一个简单版的口袋妖怪游戏。到现在为止一切都很顺利,但现在我遇到了麻烦。
我的地图中包含存储在数组(私有)中的类的障碍,并使用get方法在其他类中使用该数组。 不知何故,这些其他类在第一个类中更改了数组。
这怎么可能?
答案 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();
}
}
这是因为对象是数组,而data
和x
之类的变量是引用到同一个数组对象 - 只有一个数组和data
和x
都引用那个数组。如果修改数组,您将看到两个变量的变化。
如果你想避免这种情况,那么你不应该直接在类getData()
的{{1}}方法中返回它来公开数组。你应该复制一个数组:
Example