使用公共方法更改 Java 中的私有字段
Changing private fields in Java using public methods
在C++中,有一种方法可以更改数据,即使它是私有的:
class Foo
{
private:
char * i;
public:
char * getInt() {return i;};
Foo() {i="Winter";};
}
int main()
{
Foo a;
strcpy(a.getInt(), "Summer"); //it changes i
cout<<a.getInt(); //gives "Summer"
return 0;
}
有没有办法在Java中做到这一点?
编辑:如果有,那么是否有一些关键字,如C++中的const
,以防止这种行为?
Java 返回指向对象的指针副本(以及原语值的副本)。String
就是这样一个对象。例如
class Foo {
private String i = "Winter";
public String get() { return i; }
}
现在这是完全安全的,没有什么(除了反射)可以改变你的私人领域或其状态:
void main() {
Foo a = new Foo();
String i = a.get();
String j = i + " rocks"; // creates a new string
i = "Summer"; // now points to another string
System.out.println(a.get()); // still prints "Winter"
}
但是,如果代码能够修改返回的对象,则无法阻止它更改它。
Java也没有使对象不可变的内置方法,您必须将它们设计为实际上不可变的,例如String
类。每个"修改"字符串的方法实际上都会创建一个新的不可变字符串,该字符串可以在所有位置和线程之间共享,而无需担心。
如果你的班级是
class Foo {
public String i = "Winter";
}
你不会安全的。代码可以更改该字段指向的内容。
void main() {
Foo a = new Foo();
a.i = "Summer"; // that works.
System.out.println(a.i); // prints "Summer"
}
虽然您不应该拥有公共字段,特别是如果您不希望对其进行修改,但有一些帮助:final
。
class Foo {
public final String i = "Winter";
}
void main() {
Foo a = new Foo();
a.i = "Summer"; // Error: final field cannot be modified.
}
final
关键字保证一个字段只分配一次。该字段在构造函数完成后需要具有值,并且之后无法更改。但是,引用的对象可能仍然是可变的,只是对它的引用不是可变的。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 无法从JNI设置Java Int数组字段
- 访问派生类对象的字段,C++与Java
- 使用公共方法更改 Java 中的私有字段