为什么在方法insert()中初始化i使其值为0,而字符串j(未初始化)的打印方式如预期的那样?
import java.io.*;
class Stu
{
int id,i;
String name,j;
void insert(int id,String name)
{
System.out.println(id+" "+name);
int i=id;
j=name;
}
void display()
{
System.out.println(id+" "+name);
System.out.println(i+" "+j);
}
}
class New
{
public static void main(String[] args)
{
Stu s1=new Stu();
s1.insert(101,"sriram");
s1.display();
}
}
输出是:
C:\ Users \ ASUS \ Desktop> javac New.java
C:\ Users \ ASUS \ Desktop> java New
101 sriram
0 null
0 sriram
你在这里做的不是在insert
方法中再次初始化相同的变量,而是在insert
块中创建一个具有相同名称的新变量。您的查询可以使用局部变量与全局变量的范围进行汇总。
声明和使用变量时,编译器会尝试在可用的最窄范围内解析该变量。就像在你的情况下,在insert
方法中,你创建了一个变量,即i
,它是insert
的局部变量,它的范围是直到你在insert
内。一旦退出该方法,它就会超出范围或死亡。所以,你正在初始化当地的i
有一些价值,一旦你离开insert
就会死亡。
现在,当您要求编译器解析i
中的变量display
时,编译器首先查找在本地范围内声明的任何i
。如果未找到,它将在全局范围内搜索。然后它找到i
并打印出值。
现实生活中的例子可能是::假设有一个人生活在你的社会里。现在当有人在你家里打电话给Sriram时,你会立即提示。但是,如果有人打电话给斯里兰姆站出来远离你的房子,另一个人会回应。
由于该计划的范围。当你在类的开头创建“i”时,该函数可以被类中的每个函数访问;你不要将它声明为任何东西,所以它设置为null。
在insert()方法中,创建一个名为i的新变量。这个新的i变量在你的insert函数的调用堆栈上。当调用该函数时,它“超出范围”,并从调用堆栈中擦除。该函数中的变量也被擦除。
当您调用display时,它使用您在类开头创建的“i”值。
void insert(int id, String name) {
System.out.println(id + " " + name);
**int i** = id;
j = name;
}
请参阅插入函数,您再次声明了int i。
使用像i = id;
在,“实例变量”和“局部变量”之间存在巨大差异。
将您的插入方法更改为
void insert(int id,String name)
{
System.out.println(id+" "+name);
i=id; // notice that i changed this line
j=name;
}
您在insert方法中声明了名为i的变量,然后为其赋值id。一旦方法插入完成执行,本地i变量就超出了范围。