gpt4 book ai didi

Java 变量在 void 方法后更新

转载 作者:行者123 更新时间:2023-12-02 10:09:50 26 4
gpt4 key购买 nike

我对 Java 的工作原理有点困惑,我知道以下内容是正确的:

public static void main(String[] args) {
int c=0;
changeC(c);
System.out.println(c); // 0
}

public static void changeC(int c) {
c++;
}

我们知道c输出0因为changeC方法不改变原来c

现在我正在查看 solution on Leetcode ,并且似乎遵循类似的概念。

这是代码:

public int numIslands(char[][] grid) {
int count=0;
for(int i=0;i<grid.length;i++)
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='1'){
dfsFill(grid,i,j);
count++;
}
}
return count;
}
private void dfsFill(char[][] grid,int i, int j){
if(i>=0 && j>=0 && i<grid.length && j<grid[0].length&&grid[i][j]=='1'){
grid[i][j]='0';
dfsFill(grid, i + 1, j);
dfsFill(grid, i - 1, j);
dfsFill(grid, i, j + 1);
dfsFill(grid, i, j - 1);
}
}

在本例中,网格被传递给 void 函数 dfsFills() 。然而,无论如何dfsFill()执行gridgridnumIslands()功能也更新了。

为什么这与我的第一个示例的行为不同?一个是按引用传递,另一个是按值传递?

最佳答案

它不是按引用传递,因为无论方法内部发生什么,调用者的变量grid仍然指向调用前的同一个对象。

不同之处在于,grid是一个可变对象(数组),因此该方法可以导致grid内部的状态发生变化。由于两个地方(调用者和被调用者)都查看同一个对象,因此它们都会看到在那里所做的更改。

Java 中的一切都是按值传递的。但除了基本类型之外,传递的“值”是指向对象的指针。因此,如果该对象的状态是可变的,则需要小心。

“按引用传递”意味着该方法可以更改调用者的变量以指向不同的对象。这是不可能的。在您的示例中,您可以确定例如grid 并不是突然 null 或其长度发生了变化。

关于Java 变量在 void 方法后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55072923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com