我发现以下问题是Java"pass-by-reference"还是"pass-by-value"?.
我几乎阅读了所有内容,但是如果我想要这个foo(-)方法,我还不知道该怎么做才能改变我String的价值?(也许或不参考,对我来说无关紧要).
void foo(String errorText){
errorText="bla bla";
}
int main(){
String error="initial";
foo(error);
System.out.println(error);
}
Run Code Online (Sandbox Code Playgroud)
我想bla bla在控制台上看到.可能吗?
public class StackOverFlow {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("A");
al.add("B");
markAsNull(al);
System.out.println("ArrayList elements are "+al);
String str = "Hello";
markStringAsNull(str);
System.out.println("str "+ str);
}
private static void markAsNull(ArrayList<String> str){
str.add("C");
str= null;
}
private static void markStringAsNull(String str){
str = str + "Append me";
str = null;
}
}
Run Code Online (Sandbox Code Playgroud)
ArrayList elements are [A, B, C]
str Hello
Run Code Online (Sandbox Code Playgroud)
在这种情况下ArrayList,添加的元素将被检索.如果String方法调用对传递的String没有影响.JVM到底在做什么?谁能详细解释一下?
是否可以创建一个PHP函数,通过引用获取所有参数的可变数量的参数?
它没有帮助我通过引用接收一个值数组的函数,也没有一个函数将其参数包含在一个对象中,因为我正在处理函数组合和参数绑定.不要考虑呼叫时间传递参考.那东西甚至不应该存在.
php parameter-passing pass-by-reference variadic-functions function-parameter
我最近发现了一些这样的代码:
typedef int TenInts[10];
void foo(TenInts &arr);
Run Code Online (Sandbox Code Playgroud)
你能做些什么foo()是有用的,如果宣言是:
void foo(int *arr); // or,
void foo(int arr[]); // or,
void foo(int arr[10]); // ?
Run Code Online (Sandbox Code Playgroud)
我发现了一个问题,询问如何传递对数组的引用.我猜我在问为什么.
此外,只有一个答案 "何时指向数组的指针有用?" 讨论了函数参数,所以我不认为这是一个重复的问题.
我有这个非常尴尬的问题......
void changeString(String str){
str = "Hello world":
}
main(){
String myStr = new String("");
changeString(myStr);
}
Run Code Online (Sandbox Code Playgroud)
当main返回时,该值仍然""不"Hello world".这是为什么?
另外,我如何使其工作?假设我希望我的函数changeString将其变为"Hello world"的字符串.
我目前正在阅读Accelerated C++,我意识到我并不真正了解函数签名的工作原理.
int* ptr=#
Run Code Online (Sandbox Code Playgroud)
意味着ptr现在将地址保存为num,但这意味着什么?
void DoSomething(string& str)
Run Code Online (Sandbox Code Playgroud)
从我的理解,这是一个变量的引用传递(这意味着传递地址),但当我这样做
void DoSomething(string& str)
{
string copy=str;
}
Run Code Online (Sandbox Code Playgroud)
它创造的是str的副本.我认为它会做的是引发错误,因为我正在尝试分配一个指向变量的指针.
这里发生了什么?在函数调用中使用*和&是什么意思?
所以,我刚刚开始学习Java,我发现没有"通过引用传递"这样的东西.我正在将一个应用程序从C#移植到Java,原始应用程序有一个"ref"或"out"参数的整数和双精度数.
起初我以为我可以传入"整数"或"双精度",由于这是一个引用类型,因此值将被更改.但后来我了解到那些引用类型是不可变的.
那么,我创建了一个"MutableInteger"类和一个"MutableDouble"类,并将它们传递给了我的函数.它有效,但我想我必须违背该语言的原始设计意图.
一般糟糕的设计是"通过参考"吗?我该如何改变自己的思维方式?
拥有这样的函数似乎是合理的:
bool MyClass::changeMyAandB(ref int a, ref int b)
{
// perform some computation on a and b here
if (success)
return true;
else return false;
}
Run Code Online (Sandbox Code Playgroud)
这是糟糕的设计吗?
我对目标c有点新意,我试图通过引用传递参数,但表现得像是一个值.你知道为什么这不起作用吗?
这是功能:
- (void) checkRedColorText:(UILabel *)labelToChange {
NSComparisonResult startLaterThanEnd = [startDate compare:endDate];
if (startLaterThanEnd == NSOrderedDescending){
labelToChange.textColor = [UIColor redColor];
}
else{
labelToChange.textColor = [UIColor blackColor];
}
}
Run Code Online (Sandbox Code Playgroud)
这就是电话:
UILabel *startHourLabel; // This is properly initialized in other part of the code
[self checkRedColorText:startHourLabel];
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
假设我们有一个ArrayList myArray.我想通过调用它的函数来修改一个对象.如果我这样做,原始对象是否会被更改?
myArray.get(0).myModyfyingFunction();
Run Code Online (Sandbox Code Playgroud)
为了进一步澄清 - 我担心get()实际上是返回对原始对象的引用还是只返回原始对象的副本.
我认为对象是作为参考传递的.但是当我删除时b,它仍然存在c.请看这个例子:
第一部分对我有意义,因为它通过引用传递:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = 'rawr';
console.log(uneval(a)); // outputs: "({b:{val:"rawr"}, c:{val:"rawr"}})"
Run Code Online (Sandbox Code Playgroud)
现在这部分对我来说没有意义:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = 'rawr';
delete a.b;
console.log(uneval(a)); // outputs: "({c:{val:"rawr"}})"
Run Code Online (Sandbox Code Playgroud)
所以b删除属性,但c属性将属性保存到删除前引用的属性.这是javascript中的错误吗?
编辑:谢谢所有的回复!所以它不是一个bug,而且这种行为实际上非常好,它允许人们在保留对象的同时更改"key"/"property"名称!:)
java ×4
c++ ×2
parameters ×2
string ×2
arraylist ×1
arrays ×1
function ×1
immutability ×1
javascript ×1
objective-c ×1
php ×1