不同的对象,同名变量应该有两个不同的值,但不是吗?

Different Objects, same name variable should have two different values but doesn't?

目的:获取用户输入的姓名和年龄,并在末尾打印一条消息:

"Name is Age."

NameIsAge.java

public class NameIsAge 
{
    static String userName;
    static int userAge;
    NameIsAge (String userName, int userAge)
    {
        userName = this.userName;
        userAge = this.userAge;

    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public int getUserAge() {
        return userAge;
    }
    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }
    final void run(String[] args)
    {
        System.out.println(userName + " is " + userAge);
    }
}

NameIsAgeLauncher.java

import java.util.Scanner;
public final class NameIsAgeLauncher {
    private NameIsAgeLauncher() 
    {
    }
    public static void main(String[] args) {
        String userName = null;
        int userAge = 0;
        Scanner stdIn = new Scanner(System.in);
        System.out.println("Enter your name: "); //Prompts user to enter name.
        NameIsAge.userName = stdIn.nextLine(); //Name from Practice should be equal to what the user enters.
        System.out.println("Enter your age: "); //Prompts user to enter name.
        NameIsAge.userAge = stdIn.nextInt(); //Name from Practice should be equal to what the user enters.
        NameIsAge blah = new NameIsAge(userName, userAge);

        NameIsAge halb = new NameIsAge ("Campbell", 97);
        halb.setUserName("Campbell");
        halb.setUserAge (97);
        System.out.println(blah.userName + " is " + blah.userAge + ".");
        System.out.println(halb.userName + " is " + halb.userAge + ".");
    }   
}

这会打印出:

Enter your name: 
dsf
Enter your age: 
32
Blah: Campbell is 97.
Halb: Campbell is 97.

它应该打印这个:

Blah: dsf is 32.
Halb: Campbell is 97.

Y 设置 halb 的值会发生变化吗?

这是由静态修饰符引起的。

static String userName;
static int userAge;

删除静态关键字是诀窍
静态修饰符表示它适用于所有实例。
顺便提一句。构造函数不好,应该是:

NameIsAge (String userName, int userAge)
{
    this.userName = userName;
    this.userAge = userAge;

}

完整代码如下:
辅助变量尽量使用局部变量

import java.util.Scanner;
public final class NameIsAgeLauncher {
private NameIsAgeLauncher() 
{
}
public static void main(String[] args) {
    String userName = null;
    int userAge = 0;
    Scanner stdIn = new Scanner(System.in);
    System.out.println("Enter your name: "); //Prompts user to enter name.
    userName = stdIn.nextLine(); //Name from Practice should be equal to what the user enters.
    System.out.println("Enter your age: "); //Prompts user to enter name.
    userAge = stdIn.nextInt(); //Name from Practice should be equal to what the user enters.
    NameIsAge blah = new NameIsAge(userName, userAge);

    NameIsAge halb = new NameIsAge ("Campbell", 97);
    halb.setUserName("Campbell");
    halb.setUserAge (97);
    System.out.println(blah.userName + " is " + blah.userAge + ".");
    System.out.println(halb.userName + " is " + halb.userAge + ".");
}   
}

.

public class NameIsAge 
{
String userName;
int userAge;
NameIsAge (String userName, int userAge)
{
    this.userName = userName;
    this.userAge = userAge;

}
public String getUserName() {
    return userName;
}
public void setUserName(String userName) {
    this.userName = userName;
}
public int getUserAge() {
    return userAge;
}
public void setUserAge(int userAge) {
    this.userAge = userAge;
}
final void run(String[] args)
{
    System.out.println(userName + " is " + userAge);
}
}