Java中带参数的方法

Java中带参数的方法,java,methods,parameter-passing,Java,Methods,Parameter Passing,有人能解释一下为什么这样做吗 我在Eclipse中有两个类。 名为“Car”的类包含以下代码 public class Car { public void printOut(String variable1){ System.out.println("Hello " +variable1); } } 另一个类,也就是我的“main”所在的类,叫做“House”,里面的代码是 import java.util.Scanner; class House {

有人能解释一下为什么这样做吗

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

public class Car {
    public void printOut(String variable1){
        System.out.println("Hello " +variable1);
    }
}
另一个类,也就是我的“main”所在的类,叫做“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”除了它们都是字符串类之外,它们之间有什么关系吗

因为我不明白为什么代码编译正确

对我来说,看起来变量1和变量2没有关联,即使它们都是字符串类的,看起来它们之间没有交互,而且变量1根本不在“House”类中使用,但它仍然知道编译我输入的任何内容。
就好像“variable1”被“variable2”替换,variable2包含的任何内容都会被打印出来

Variable2值将在调用该方法时移动到variable1

Variable2中的引用将被简单地调用并复制到Variable2中。变量2作为方法参数传递。 除此之外,没有任何关系。Variable2仅对main是本地的,variable1仅对打印输出是本地的。 将variable1视为一个函数参数,它期望调用方法提供一个值。这意味着您可以将任何字符串传递到打印输出中

例如
carObject.printOut(“丰田”)

正如您所看到的,我不是将变量传递到printOut,而是一个硬编码字符串,它们与将variable2传递到printOut()方法完全相同。variable1只是方法参数的名称。

来自调用者或被调用者的变量名称无效。您可以有一个名为
orange
的变量参数,另一个名为
helposer
的变量参数也可以这样做。重要的是它们必须具有相同的类型(此处为
String


调用方变量的内容被传递给方法,无论两个变量的名称是什么。

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

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

Car
中的方法定义在某种程度上是您使用它时的原型。你有没有在数学中用“黑匣子”教过函数?你输入一个数字,然后得到输出。因此,输入3,如果函数为f(x)=Xx2,则输出为6。在调用该方法之前,var2与var1完全不同。但是,在方法中,传递var2并替换方法中使用的所有var1。别担心,当我启动Java时,我也没有得到这一点,它们只是因为您正在将
variable2
传递到您的
汽车中。想象一下这个类比:你知道如何按命令做数学作业。您是一个名为
FacelessVoid
的对象,并且您有一个名为
dohomography
的方法
dohomography
接受类型为
Work
的单个参数。在现实世界中,我会有一盒工作,我会把这盒工作倒在你的桌子上。我在盒子上写的任何东西对你来说都无关紧要,但是盒子里的东西会被扔到你的桌子上,在那里你可以随意称呼它


这正是代码中发生的情况:您有一个名为
variable2
的字符串,它的内容被“转储”到
variable1
内部的
打印输出中。不过值得注意的是,字符串实际上并没有被
转储到方法中,而是复制了一个引用。所以它是同一个对象,只是叫做不同的东西。

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


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

其他人给出了很好的答案,但为了正确使用词汇表,
variable1
被称为a,而
variable2
是实际参数,也称为传递给方法
printOut
的“参数”。当涉及到传递参数时,更容易意识到您只是在玩弄名称。在直觉层面,它只是在数据位置上玩游戏,而不是按名称引用东西。

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

variable2                   memory location 1100
[1100]      ------>         "hello"
variable1也是对内存中某个字符串的引用。调用该函数时,variable2(在本例中为1100)中的值放在variable1中

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

因此,函数可以使用variable1查找variable2引用的字符串,因为字符串的位置包含在两者中。或者换句话说,它们都引用同一个字符串。

非常感谢,这完全有道理,我只是不确定“为什么”。我知道它是怎么工作的,只是不知道为什么。多亏了你和其他人的回答,我明白了。你们太棒了。不用担心,只要记住接受最好的答案(暗示,暗示):)谢谢。这对我很有帮助。非常感谢你的回复。