有人可以解释为什么这有效。
我在Eclipse中有2个类。 名为“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);
}
}
当我运行代码时,它会工作,它会写“在这里输入名称”,当我输入时,它会继续说“Hello”名称输入“”
我的问题是,'variable1'和'variable2'与彼此有任何关系,除了它们都是String类。
因为我对代码正确编译的原因感到困惑。
对我来说,看起来变量1与variable2没有任何关联,即使它们都是String类,看起来它们看起来不像彼此互动,并且变量1没有在“House”中使用“班级,但它仍然知道编译我输入的任何东西。 这就好像'variable1'被'variable2'替换了,并且无论variable2包含什么都被打印出来。
答案 0 :(得分:3)
类Car
中的方法定义是您使用它时的原型。你有没有被教过“黑匣子”的数学函数?你输入一个数字,然后得到输出。因此,输入3,如果函数为f(x)= Xx2,则输出为6.在调用方法之前,var2与var1完全不同。但是,在方法中,传递var2并替换您在方法中使用的所有var1。别担心,当我开始使用Java时,我没有得到这个。
答案 1 :(得分:3)
它们只是因为您将variable2
传递到Car.printOut
方法而相关。想象一下这个类比:你知道如何按命令做数学作业。您是一个名为FacelessVoid
的对象,您有一个名为doHomework
的方法。 doHomework
采用Work
类型的单个参数。在现实世界中,我会有一盒工作,我会把工作箱倒在你的桌子上。我在盒子上写的东西对你来说无关紧要,但是盒子的内容会被丢弃到你的桌子上,你可以随意调用它。
这正是您的代码中发生的事情:您有一个名为variable2
的字符串,其内容被“转储”到variable1
printOut
内。值得注意的是,字符串实际上并没有dumped
进入您的方法,因此会复制引用。所以它是同一个对象,它只是被称为不同的东西。
答案 2 :(得分:1)
变量2中的引用将被简单地调用复制到variable2中。 variable2作为方法参数传递。 除此之外没有任何关系。 Variable2仅对main是本地的,variable1仅对printOut是本地的。 将variable1视为期望来自调用方法的值的函数参数。意思是你可以将任何字符串传递给printOut。
例如carObject.printOut("Toyota")
如您所见,我没有将变量传递给printOut,而是传递硬编码字符串
答案 3 :(得分:1)
variable2是内存中某个字符串的引用。 Java使用variable2中的值来找出字符串的位置。例如:
variable2 memory location 1100
[1100] ------> "hello"
variable1也是对内存中某个字符串的引用。调用函数时,variable2中的值(在本例中为1100)放在variable1中。
variable1 memory location 1100
[1100] ------> "hello"
因此函数可以使用variable1找到variable2引用的字符串,因为字符串的位置包含在两者中。或换句话说,它们都引用相同的字符串。
答案 4 :(得分:0)
在调用方法
时,Variable2值将移动到variable1答案 5 :(得分:0)
它们与将variable2传递给printOut()方法完全相同。 variable1只是方法参数的名称。
答案 6 :(得分:0)
来自调用者或被调用者的变量名称无效。你可以有一个名为orange
的变量参数,另一个helicopter
也可以这样做。重要的是它们必须具有相同的类型(此处为String
)。
无论两个变量的名称如何,调用者变量的内容都会传递给该方法。
答案 7 :(得分:0)
variable1
实际上不是变量,它是将传递给方法的变量的名称。您将需要此名称,因为您在方法中使用它来进行某些操作。因此,当您传递variable2
(现在确实是变量)时,您会在名为variable1
的方法中看到它。希望这会有所帮助。
答案 8 :(得分:0)
在Java中,参数始终按值传递。但是,如果您传递一个对象,那么它指向原始对象引用,您可以修改原始对象。
答案 9 :(得分:0)
没有关系v1和v2。 当您从Hous类调用car.printOut()方法时,它会将v2作为值推送到堆栈。 car.printOut()方法将此值从堆栈中弹出到v1变量。因此,您可以使用任何名称。
此外,当您在printOut()更改v1的值时,v2将不会更改。
答案 10 :(得分:0)
其他人给出了很好的答案,但为了使你的词汇量合适,variable1
被称为"formal parameter",而variable2
是实际参数,也被称为"参数& #34;传递给方法printOut
。在传递参数时,更容易意识到你只是在玩名字。在肠道层面,它只是在玩数据位置而不是按名称引用东西。