有时我看到API使用long或Long或int或Integer,我无法确定如何做出决定?
我什么时候应该选择什么?
这个Java代码:
public class XYZ {
public static void main(){
int toyNumber = 5;
XYZ temp = new XYZ();
temp.play(toyNumber);
System.out.println("Toy number in main " + toyNumber);
}
void play(int toyNumber){
System.out.println("Toy number in play " + toyNumber);
toyNumber++;
System.out.println("Toy number in play after increement " + toyNumber);
}
}
Run Code Online (Sandbox Code Playgroud)
将输出:
Toy number in play 5 Toy number in play after increement 6 Toy number in main 5
在C++中,我可以通过toyNumber引用传递变量以避免阴影,即创建同一个变量的副本,如下所示:
void main(){
int toyNumber = 5;
play(toyNumber);
cout << "Toy …Run Code Online (Sandbox Code Playgroud) 所以我前几天正在玩,只是为了确切了解JavaScript中的大规模分配是如何工作的.
首先我在控制台中尝试了这个例子:
a = b = {};
a.foo = 'bar';
console.log(b.foo);
Run Code Online (Sandbox Code Playgroud)
结果是"警报"显示在警报中.这是公平的,a并且b实际上只是同一对象的别名.然后我想,我怎么能让这个例子更简单.
a = b = 'foo';
a = 'bar';
console.log(b);
Run Code Online (Sandbox Code Playgroud)
这几乎是一回事,不是吗?那么这一次,它foo不会bar像我期望的那样返回第一个例子的行为.
为什么会这样?
注意:使用以下代码可以更简化此示例:
a = {};
b = a;
a.foo = 'bar';
console.log(b.foo);
a = 'foo';
b = a;
a = 'bar';
console.log(b);Run Code Online (Sandbox Code Playgroud)
(我怀疑JavaScript将字符串和整数等原语与哈希处理不同.哈希返回指针,而"核心"原语返回自己的副本)
我知道这可能非常愚蠢,但很多地方声称Java中的Integer类是不可变的,但是下面的代码:
Integer a=3;
Integer b=3;
a+=b;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
给出(预期)结果毫无困难地执行6.因此,a的值有效地改变了.这不意味着Integer是可变的吗?次要问题和一点offtopic:"不可变类不需要复制构造函数".有人在乎解释原因吗?
将对象作为参数传递时,JavaScript会通过引用传递它们,并且很难创建对象的本地副本.
var o = {};
(function(x){
var obj = x;
obj.foo = 'foo';
obj.bar = 'bar';
})(o)
Run Code Online (Sandbox Code Playgroud)
o会有.foo和.bar.
通过克隆来解决这个问题是可能的.简单的例子:
var o = {};
function Clone(x) {
for(p in x)
this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p];
}
(function(x){
var obj = new Clone(x);
obj.foo = 'foo';
obj.bar = 'bar';
})(o)
Run Code Online (Sandbox Code Playgroud)
o不会有.foo或.bar.
我一直在研究Java String.以下问题基于以下帖子
Java String是java中特殊
的String不可变性
不可变性:现在,通过不变性,String类被设计为公共池中的值可以在其他位置/变量中重用.如果String被创建为, 则这很好
String a = "Hello World!";
但是,如果我创建String之类的
String b = new String("Hello World!");
为什么这也是不变的?(或者是吗?).由于这有一个专用的堆内存,我应该能够修改它而不影响任何其他变量.因此,通过设计,还有其他任何原因,为什么String整体被认为是不可改变的?或者我的上述假设是错误的?
我想问的第二件事是关于常见的字符串池.如果我创建一个字符串对象为
String c = "";
是在池中创建的空条目?
这些帖子上已经有帖子吗?如果是这样,有人可以分享链接吗?
在我大学的C编程课程中,教授及其后来的书在引用C中的指针时使用了术语调用或通过引用传递.
我的教授称之为"参考函数调用"的一个例子:
int sum(int *a, int *b);
Run Code Online (Sandbox Code Playgroud)
我的教授称之为"价值函数呼叫"的一个例子:
int sum(int a, int b);
Run Code Online (Sandbox Code Playgroud)
我读过 C不支持通过引用调用.根据我的理解,指针通过值传递.
基本上,说指针是C通过引用传递的方式是不正确的吗?说你不能通过C中的引用传递但是可以使用指针替代它会更正确吗?
2015年11月11日更新
从我的问题起源的方式来看,我认为术语的争论已经产生,实际上我看到了两个具体的区别.
在阅读了@Haris的更新答案之后,为什么这不是那么黑白,这是有道理的.
有人可以给我一些在函数中使用输出参数的示例代码吗?我试过谷歌它,但只是在功能中找到它.我想在另一个函数中使用此输出值.
我正在开发的代码旨在在Android中运行.
在Java中,您可以使用final关键字限定局部变量和方法参数.
public static void foo(final int x) {
final String qwerty = "bar";
}
Run Code Online (Sandbox Code Playgroud)
这样做会导致无法在方法体中重新分配x和qwerty.
这种做法使你的代码向不变性的方向推动,这通常被认为是一个加分.但是,它也会使代码混乱,"最终"出现在各处.您对Java中的局部变量和方法参数的final关键字有何看法?
一个java String变量,其值为
String path = "http://cdn.gs.com/new/downloads/Q22010MVR_PressRelease.pdf.null"
Run Code Online (Sandbox Code Playgroud)
我想删除最后四个字符,即.null.我可以使用哪种方法进行拆分.
java ×7
immutability ×2
javascript ×2
string ×2
android ×1
c ×1
final ×1
mutable ×1
numbers ×1
parameters ×1
pointers ×1
types ×1