java - 欺骗Java中的private关键字

标签 java object reference encapsulation getter

我知道关键字 private 的想法是启用封装。然而,当我意识到我可以在使用 getter 检索数组后对其进行修改时,我感到很困惑,这让我感到惊讶。尽管我认为 java 将所有变量视为对象,但对于普通整数来说,这不起作用。

示例:

public class PrivContainer {
private int[] myIntArray;
private int myInt;

PrivContainer(){
    myIntArray=new int[1];
    myIntArray[0]=3;
    myInt=22;
}

public int[] getIntArray(){
    return myIntArray;
}

public int getInt(){
    return myInt;
}

public void printInt(){
    System.out.println(myIntArray[0]);
    System.out.println(myInt);
}
}


public class Main {
public static void main(String[] args){
    PrivContainer pc=new PrivContainer();
    int[] r=pc.getIntArray();
    int q=pc.getInt();
    r[0]=5;
    q=33;
    pc.printInt();
}
}

printInt() 的输出是 5,22

这意味着 main 方法可以更改私有(private) array 的条目,但不能更改私有(private) int 的条目。

有人可以向我解释一下这个现象吗?

最佳答案

数组是一个可变对象。因此,如果您有对该数组的引用,则可以修改其内容。您不能对类的原始成员(例如 int)和对不可变类实例的引用(例如 StringInteger).

您的任务:

q=33;

类似于:

r = new int [5];

这两个赋值都会导致变量包含新值,但它们不会影响为这些变量分配原始值的 PrivContainer 实例的状态。

关于java - 欺骗Java中的private关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33063297/

相关文章:

java - 无法将 JTree 添加到 JInternalFrame 的 JPanel

JavaFX:视频比正常速度快 2 倍

c++ - 指向空对象的引用

javascript - 是否有一种可接受的方法来从函数/方法中省略参数?

Javascript - 删除一个对象作为函数的参数

c# - 在运行时加载引用调用程序集的程序集

java - 在调用 GET 请求之前等待 POST 完成处理

Java 方法签名和接口(interface)

java - 在方法及其引用中搜索对象

c++ - 返回对 C++ 中动态数组元素的引用?