7

有人可以解释为什么这有效。

我在 Eclipse 中有 2 个类。一个名为“Car”的类包含以下代码..

public class Car {
    public void printOut(String variable1){
        System.out.println("Hello " +variable1);
    }
}

另一个类,也就是我的“主要”所在的地方,叫做“House”,里面的代码是

import java.util.Scanner;

class House {
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        Car carObject = new Car();

        System.out.println("Enter name here: ");
        String variable2 = input.nextLine();

        carObject.printOut(variable2);
    }
}

当我运行代码时,它会工作,它会写“在此处输入名称”,当我输入它时,它会继续说“你好”输入名称“”

我的问题是,'variable1' 和 'variable2' 是否有任何关系,除了它们都是 String 类。

因为我对为什么代码编译正确感到困惑。

对我来说,看起来变量 1 与变量 2 没有相关性,即使它们都是 String 类,但看起来它们从来没有相互交互,并且 variable1 没有在“House”类中使用全部,但它仍然知道编译我输入的任何内容。就好像 'variable1' 被 'variable2' 替换,并且 variable2 包含的任何内容都会被打印出来。

4

11 回答 11

3

类中的方法定义Car是您使用它时的原型。你有没有用“黑匣子”教过数学中的函数?你输入一个数字,然后得到输出。所以,你输入 3,如果函数是 f(x) = Xx2,输出就是 6。在你调用方法之前,var2 和 var1 是完全不同的。但是,在该方法中,传递了 var2 并替换了您在该方法中使用的所有 var1。别担心,我开始Java的时候也没有这个

于 2012-10-21T07:34:34.630 回答
3

它们之所以相关,只是因为您正在传递variable2给您的Car.printOut方法。想象一下这个类比:你知道如何根据命令做数学作业。你是一个被调用的对象,FacelessVoid你有一个名为 的方法doHomeworkdoHomework接受一个类型的参数Work。在现实世界中,我会有一箱工作,我会把这箱工作扔到你的桌子上。无论我在盒子上写什么对你来说都无关紧要,但盒子里的东西会被扔到你的桌子上,在那里你可以随意称呼它。

这正是您的代码中发生的情况:您有一个名为 的字符串variable2,其内容被“转储”到variable1inside printOut。值得注意的是,字符串实际上并没有dumped进入您的方法,而是复制了一个引用。所以它是同一个对象,只是被称为不同的东西。

于 2012-10-21T07:35:36.570 回答
1

变量 2 中的引用将被简单地称为复制到变量 2 中。变量 2 作为方法参数传递。除此之外没有任何关系。变量 2 仅对 main 是本地的,variable1 仅对 printOut 是本地的。将 variable1 视为期望来自调用方法的值的函数参数。这意味着您可以将任何字符串传递给 printOut。

例如,carObject.printOut("Toyota") 如您所见,我没有将变量传递给 printOut,而是一个硬编码字符串

于 2012-10-21T07:32:01.100 回答
1

variable2 是对内存中某处的字符串的引用。Java 使用 variable2 中的值来找出字符串的位置。例如:

variable2                   memory location 1100
[1100]      ------>         "hello"

variable1 也是对内存中某处的字符串的引用。当您调用该函数时,variable2 中的值(在本例中为 1100)被放置在 variable1 中。

variable1                   memory location 1100
[1100]      ------>         "hello"

因此该函数可以使用 variable1 找到 variable2 引用的字符串,因为字符串的位置都包含在两者中。或者换一种说法,它们都引用相同的字符串。

于 2012-10-21T07:46:53.390 回答
0

在调用该方法时,变量 2 的值将被移动到变量 1

于 2012-10-21T07:31:12.217 回答
0

它们与您将 variable2 传递给 printOut() 方法完全相同。variable1 只是方法参数的名称。

于 2012-10-21T07:32:18.320 回答
0

来自调用者或被调用者的变量名无效。你可以有一个变量参数命名orange和另一个helicopter它会做同样的事情。重要的是它们必须具有相同的类型(此处String)。

无论两个变量的名称如何,调用者变量的内容都会传递给方法。

于 2012-10-21T07:33:04.323 回答
0

variable1实际上不是变量,而是将传递给方法的变量的名称。您将需要此名称,因为您在方法中使用它进行某些操作。因此,当您通过 时variable2,它现在确实是一个变量,您会在方法中以variable1. 希望这可以帮助。

于 2012-10-21T07:33:05.970 回答
0

在 Java 中,参数总是按值传递。但是,如果您传递一个对象,则它指向原始对象引用,您可以修改原始对象。

于 2012-10-21T07:33:48.830 回答
0

没有关系 v1 和 v2。当您从 Hous 类调用 car.printOut() 方法时,它会将 v2 作为值推送到堆栈。car.printOut() 方法将此值从堆栈中弹出到 v1 变量。因此,您可以使用任何名称。

此外,当您在 printOut() 处更改 v1 的值时,v2 不会更改。

于 2012-10-21T07:36:49.457 回答
0

其他人已经给出了很好的答案,但只是为了让您的词汇正确,variable1称为“形式参数”,而variable2实际参数,也称为传递给方法的“参数” printOut。在传递参数时,更容易意识到你只是在玩名字。在直觉层面,它只是在玩弄数据位置,而不是按名称引用东西。

于 2012-10-21T07:41:33.387 回答