我了解到,当您在Java中修改变量时,它不会更改它所基于的变量
int a = new Integer(5);
int b = a;
b = b + b;
System.out.println(a); // 5 as expected
System.out.println(b); // 10 as expected
Run Code Online (Sandbox Code Playgroud)
我假设对象有类似的东西.考虑这个课程.
public class SomeObject {
public String text;
public SomeObject(String text) {
this.setText(text);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Run Code Online (Sandbox Code Playgroud)
在我尝试这段代码后,我感到困惑.
SomeObject s1 = new SomeObject("first");
SomeObject s2 = s1;
s2.setText("second");
System.out.println(s1.getText()); // second as UNexpected
System.out.println(s2.getText()); // second as expected
Run Code Online (Sandbox Code Playgroud)
请向我解释为什么更改任何对象会影响另一个对象.我知道变量文本的值存储在两个对象的内存中的相同位置.
为什么变量的值是独立的但与对象相关?
另外,如果简单的赋值不能完成工作,如何复制SomeObject?
我想知道什么时候设置copy-local=true引用有任何启发式方法?
如果引用类型只在内部使用我可以设置copy-local到true,但如果被引用类型暴露作为参数和返回值我设置copy-local到false和指示时,应使用我的媒体库的依赖特定版本应参照?
谁能为我澄清一下这个?
变量,对象和引用之间究竟有什么区别?
例如:它们都指向某种类型,并且它们都必须保存值(当然除非您具有临时的无效类型),但它们的功能和实现究竟如何彼此不同?
例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
Run Code Online (Sandbox Code Playgroud)
它们有相同的概念,但它们有何不同?
C++引用有两个属性:
指针是相反的:
为什么C++中没有"不可为空,可重复的引用或指针"?我想不出为什么参考不应该是可重复的一个很好的理由.
编辑: 问题经常出现,因为我通常使用引用,当我想确保"关联"(我在这里避免使用"引用"或"指针")永远无效.
我认为我从没想过"这个引用始终指的是同一个对象".如果引用是可重用的,那么仍然可以得到当前的行为:
int i = 3;
int& const j = i;Run Code Online (Sandbox Code Playgroud)
这已经是合法的C++,但毫无意义.
我重申我的问题: "'引用的背后是什么原因是对象'设计?为什么引用始终是同一个对象,而不是仅当声明为const时才被认为是有用的?"
干杯,菲利克斯
.NET中对象引用的大小是多少?它是否在x86,x64和/或AnyCPU编译之间有所不同?
如果它有所作为,我个人对C#感兴趣.
那些之间是否有某种微妙的区别:
void a1(float &b) {
b=1;
};
a1(b);
Run Code Online (Sandbox Code Playgroud)
和
void a1(float *b) {
(*b)=1;
};
a1(&b);
Run Code Online (Sandbox Code Playgroud)
?
它们都是相同的(或者看起来似乎来自main()),但第一个显然更短,但我看到的大部分代码都使用第二种表示法.有区别吗?也许万一它是一些对象而不是浮动?
然而,我在这里寻找的是有用的片段,可重复使用的小"帮助"功能.或者模糊但又漂亮的模式,你永远不会记得.
就像是:
open System.IO
let rec visitor dir filter=
seq { yield! Directory.GetFiles(dir, filter)
for subdir in Directory.GetDirectories(dir) do
yield! visitor subdir filter}
Run Code Online (Sandbox Code Playgroud)
我想把它作为一个方便的参考页面.因此,没有正确的答案,但希望有很多好的答案.
EDIT Tomas Petricek专门为F#片段创建了一个网站http://fssnip.net/.
我一遍又一遍地得到同样的问题,我想要引用的对象被复制,或者我想要复制的对象被引用.当我使用=运算符时会发生这种情况.
例如,如果我将对象发送到另一个表单,即:
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
Run Code Online (Sandbox Code Playgroud)
...然后修改表单中的对象,原始对象不会被修改.就好像复制了对象而没有引用对象.然而,当我这样做时:
SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;
Run Code Online (Sandbox Code Playgroud)
...然后修改anotherObject,也myObject进行修改.
最恶化的情况是当我尝试克隆我定义的一个对象时:
public class SomeObject
{
double value1, value2;
//default constructor here
public SomeObject(val1, val2)
{
value1 = val1;
value2 = val2;
}
public void Clone(SomeObject thingToCopy)
{
this.value1 = thingToCopy.value1;
this.value2 = thingToCopy.value2;
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做的时候......
SomeObject obj1 = new SomeObject(1, 2);
SomeObject obj2 = new …Run Code Online (Sandbox Code Playgroud) 我看到该范围返回键和值的"副本".该范围是否有办法返回该项目的地址?例
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/AFOGG9NGpx
这里"字段"没有被修改,因为范围发送字段的副本,我是否必须使用索引或是否有任何其他方法来修改值?
谢谢阅读.