谁有权决定?
编辑:显然我没有成功地完善我的问题.
我不是在问Java的论证是如何传递的.我知道看起来像持有对象的变量实际上是一个包含对象引用的变量,并且该引用是按值传递的.这里有很多很好的解释(在链接的线程和其他线程中)和其他地方.
问题是关于术语传递的技术含义.(结束编辑)
我不确定这是否是SO的正确问题,如果没有道歉,但我不知道更好的地方.在这里的其他问题中已经说了很多,例如Java是"传递参考"还是"传递价值"?并通过引用或通过值传递?,但我没有找到该术语含义的权威答案.
我认为"通过引用传递"意味着"将引用(通常是指针)传递给对象",因此被调用者可以修改调用者看到的对象,而"按值传递"意味着复制对象,并让被调用者玩得开心(显而易见的问题:如果对象包含引用,深层复制或浅层).
唱FW变成了很多 的 地方 说: "按引用传递"的意思只是说,这里有一些说法,这意味着更多的,但仍然定义读
一种ParameterPassing模式,其中将实际参数的引用(或者如果你想在政治上不正确,指针)传递给形式参数; 当被调用者需要形式参数时,它取消引用指针以获取它.
我没有发现许多地方给出了更强的术语定义,在这个页面上,我发现"形式参数的左值设置为实际参数的左值".并且,如果我理解正确,这里使用相同的定义("形式参数仅作为实际参数的别名.")
事实上,我发现使用更强定义的唯一地方是反对这样一种观点,即在Java中,对象是通过引用传递的(这可能是由于我缺乏google-fu).
所以,如果我把事情弄清楚,那就是通过参考传递
class Thing { ... }
void byReference(Thing object){ ... }
Thing something;
byReference(something);
Run Code Online (Sandbox Code Playgroud)
根据第一个定义大致对应(在C中)
struct RawThing { ... };
typedef RawThing *Thing;
void byReference(Thing object){
// do something
}
// ...
struct RawThing whatever = blah();
Thing something = &whatever;
byReference(something); // pass whatever by reference …Run Code Online (Sandbox Code Playgroud) 我的变量范围有问题.
public static void main(String[] args){
int[] test={1,2,3};
test(test);
System.out.println(test[0]+" "+test[1]+" "+test[2]);
}
static void test(int[] test){
test[0]=5;
}
Run Code Online (Sandbox Code Playgroud)
我期望输出到1 2 3,但结果是5 2 3.为什么我在方法中更改了数组中的值,但原始数组发生了变化?
我有一个关于在Java中更改方法中的变量值的问题.
这是我的代码:
public class Test {
public static void funk(int a, int[] b) {
b[0] = b[0] * 2;
a = b[0] + 5;
}
public static void main(String[] args) {
int bird = 10;
int[] tiger = {7};
Test.funk(bird, tiger);
}
}
Run Code Online (Sandbox Code Playgroud)
执行该方法后Test.funk(bird, tiger),bird的值不会更改 - 它保留值10,即使在funk()方法中我们更改了值a = b[0] + 5;
另一方面,数组中元素的值会发生变化,因为我们有语句 b[0] = b[0] * 2;
我不明白为什么一件事改变而另一件事没改变?有人可以帮我解释一下.
我现在是大学新生,主修CS.我刚刚完成了我的"计算机程序设计入门"课程.我喜欢它,觉得我学到了很多东西.
几天前,我读了乔尔的"Java学校的危险"."链接列表?" 我想,"那些甚至都不是很难.我们已经完成了一些已经上课的人." 这是正确的,因为在Java中,它们并不那么难.但无论如何,我试着用C语言写一个.
它太难了!
Joel是对的,我认为...... Java为你处理了许多小小的东西,它真的不那么难.但我决心克服我学校的Java-tude并学习如何在C中写下这个dang链表.
所以我想,有人问,有没有人知道学习C的好(和免费)在线教程,而不是试图提出很多很小的问题?具体来说,学习如何处理指针,以及所有那些符号(&,*,**,[]以及它们如何协同工作),我想,认为我已经在Java中很精通,所以我不需要对如何写教程一个"你好,世界!" 程序.但是我绝对不准备进入任何超级高级的C或C++,因为我所知道的只是Java.
任何帮助赞赏!
我写这样的时候:
public class test {
void mainx()
{
int fyeah[] = {2, 3, 4};
smth(fyeah);
System.out.println("x"+fyeah[0]);
}
void smth(int[] fyeah)
{
fyeah[0] = 22;
}
}
Run Code Online (Sandbox Code Playgroud)
它打印x22;
我写这样的时候:
public class test {
void mainx()
{
int fyeah = 5;
smth(fyeah);
System.out.println("x"+fyeah);
}
void smth(int fyeah)
{
fyeah = 22;
}
}
Run Code Online (Sandbox Code Playgroud)
它不打印x22,但打印x5.
为什么在第二个版本函数中,值不会改变?它是否仅为数组元素更改值?
我的Java书解释说,要使用对象,我们可以将它们分配给引用变量.这与指向对象的指针有什么不同?Java有指针吗?
谢谢 :)
我写了一个代码来查找二叉树的直径.需要以下建议:
算法是否正常/有什么建议吗?
public class DiameterOfTree {
public static int diameter = 0;
public static int getDiameter(BinaryTreeNode root) {
if (root != null) {
int leftCount = getDiameter(root.getLeft());
int rightCount = getDiameter(root.getRight());
if (leftCount + rightCount > diameter) {
diameter = leftCount + rightCount;
System.out.println("---diameter------------->" + diameter);
}
if ( leftCount > rightCount) {
return leftCount + 1;
}
return rightCount + 1;
}
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)可以像这样在java中传递一个数组作为参数int[5] &result吗?我想传递对数组的引用,因为我想在调用函数中更改数组.语法是什么?
如果实例变量设置为final,则其值不能更改为
public class Final {
private final int b;
Final(int b) {
this.b = b;
}
int getFinal() {
return b = 8; // COMPILE TIME ERROR
}
}
Run Code Online (Sandbox Code Playgroud)
在代码的某处我看到实例类变量 HashMap被 声明为final
private final Map<String, Object> cacheMap = new HashMap<String, Object>();
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这样宣布?通常在这种情况下它被声明.这是否意味着如果我放入哈希映射然后我无法更改其值?
编辑:
如果声明为final的cacheMap作为参数传递给另一个类,那么如果我更改其引用,则不会显示final的错误.为什么会这样?
class CacheDTO {
private Map conditionMap;
public Map getConditionMap() {
return conditionMap;
}
public void setConditionMap(Map conditionMap) {
this.conditionMap = conditionMap;
}
}
Run Code Online (Sandbox Code Playgroud)
然后
private final Map<String, Object> cacheMap = new HashMap<String, Object>();
CacheDTO cc = …Run Code Online (Sandbox Code Playgroud) 我正在尝试处理我的应用程序中的异常.我正在尝试记录异常,然后使用Toast提醒用户存在问题.我在我的所有类中都有这个工作查找扩展Activity.
但是,在任何没有扩展活动的类中,我都无法使用toast方法,因为我无法获取当前上下文.有没有一种简单的方法来解决这个问题,还是我的班级应该扩展活动?
java ×9
arrays ×3
scope ×2
algorithm ×1
android ×1
binary-tree ×1
c ×1
final ×1
parameters ×1
pointers ×1
recursion ×1
reference ×1
terminology ×1
tree ×1
variables ×1