当我在方法中再次初始化时会发生什么,即使先前已初始化具有相同名称的实例变量

问题描述 投票:-1回答:4

为什么在方法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

java
4个回答
0
投票

你在这里做的不是在insert方法中再次初始化相同的变量,而是在insert块中创建一个具有相同名称的新变量。您的查询可以使用局部变量与全局变量的范围进行汇总。

声明和使用变量时,编译器会尝试在可用的最窄范围内解析该变量。就像在你的情况下,在insert方法中,你创建了一个变量,即i,它是insert的局部变量,它的范围是直到你在insert内。一旦退出该方法,它就会超出范围或死亡。所以,你正在初始化当地的i有一些价值,一旦你离开insert就会死亡。

现在,当您要求编译器解析i中的变量display时,编译器首先查找在本地范围内声明的任何i。如果未找到,它将在全局范围内搜索。然后它找到i并打印出值。

现实生活中的例子可能是::假设有一个人生活在你的社会里。现在当有人在你家里打电话给Sriram时,你会立即提示。但是,如果有人打电话给斯里兰姆站出来远离你的房子,另一个人会回应。


0
投票

由于该计划的范围。当你在类的开头创建“i”时,该函数可以被类中的每个函数访问;你不要将它声明为任何东西,所以它设置为null。

在insert()方法中,创建一个名为i的新变量。这个新的i变量在你的insert函数的调用堆栈上。当调用该函数时,它“超出范围”,并从调用堆栈中擦除。该函数中的变量也被擦除。

当您调用display时,它使用您在类开头创建的“i”值。


0
投票
void insert(int id, String name) {
            System.out.println(id + " " + name);
            **int i** = id;
            j = name;
        }

请参阅插入函数,您再次声明了int i。

使用像i = id;

在,“实例变量”和“局部变量”之间存在巨大差异。


0
投票

将您的插入方法更改为

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变量就超出了范围。

© www.soinside.com 2019 - 2024. All rights reserved.