Java 调用方法/变量范围

Java 调用方法/变量范围,java,Java,刚刚学习了调用方法,我想尝试一下,但是我的代码不能正常工作。它应该有两个名字并打印出来。这就是全部。我的变量是全局变量,所以我的所有方法都应该能够看到它们,但当程序运行时,它会打印“null”。有人能解释一下为什么这不起作用吗?这与传递变量有关吗?我想如果它是全球性的,我就不需要这样做了 import java.util.Scanner; public class UserID { String firstName; String secondName; public void readNa

刚刚学习了调用方法,我想尝试一下,但是我的代码不能正常工作。它应该有两个名字并打印出来。这就是全部。我的变量是全局变量,所以我的所有方法都应该能够看到它们,但当程序运行时,它会打印“null”。有人能解释一下为什么这不起作用吗?这与传递变量有关吗?我想如果它是全球性的,我就不需要这样做了

import java.util.Scanner;
public class UserID {

String firstName;
String secondName;

public void readNames(){
    Scanner scan = new Scanner(System.in);

    System.out.print("Enter first name: ");
    firstName = scan.nextLine();

    System.out.print("Enter second name: ");
    secondName = scan.nextLine();

    scan.close();
}



public void printID(){

    System.out.println("Your user ID is: " + firstName);

}

public static void main(String[] args) {

    UserID readNames = new UserID();

    UserID printID = new UserID();


    readNames.readNames();

    printID.printID();


}

}

原因是您正在从“UserID”类的一个实例调用read方法,然后尝试从另一个实例检索名称。您创建的每个实例(即每次创建新实例)都是在创建一组新数据。如果您要交换“printID.printID();”,这一点可能会更清楚到“readNames.printID();”


至于修复,您应该尝试只创建一个实例,然后对该实例调用两个方法

问题是您正在创建两个类UserID的对象。 在readName对象中,您正在更改firstName和secondName变量,但在printID对象中,它们仍然为空。这是因为非静态变量与对象而不是类相关联。因此,当您打印printID对象中的变量时,它会打印null。与前面的回答一样,您可以将printID与readName交换

readNames.printID();
或者,您可以通过使变量成为静态变量,使变量与类而不是对象相关联。然后,对于您创建的所有对象,firtName和secondName将是通用的

static String firstName;
static String secondName;

更改您的代码如下

   readNames.readNames();
   readNames.printID();

   printID.readNames();
   printID.printID();
下面的变量是
实例变量
,它们存在于您创建的对象范围内

String firstName;
String secondName;
在代码中,您初始化了
readNames
对象上的变量。因此,要打印这些变量的值,必须在该实例上调用
printID()
方法。您没有在
readNames
实例上调用
printID()
方法,而是在
printID
对象实例上调用了该方法。但是,
printID
instance没有设置变量,并且该实例的默认值为Null

如果使用与
readNames()
printID()
相同的对象,您将获得正确的输出


还有一件事:有良好的命名约定,不要对对象和方法使用相同的名称。

为什么要创建同一类的两个对象?一旦你解决了这个问题,你应该能够解决它,在Java中没有全局变量这样的东西。