为什么我为我的类制作的访问器方法从不同的对象打印内容?[复制]

Why does the accessor method I made for my class print something from a different object? [duplicate]

提问人:Gisel Guerrero 提问时间:4/12/2023 更新时间:4/12/2023 访问量:29

问:

我做了 2 件我制作的谷物类物品。一个叫磨砂薄片,名字叫“磨砂薄片”,一个叫luckyCharms,名字叫“幸运符”。当我调用我编写的访问器方法来打印 FrostedFlakes 的名称时,它打印了名称“Lucky Charms”。

public class MyProgram
{
    public static void main(String[] args)
    {
        Cereal frostedFlakes = new Cereal("frosted Flakes");
        Cereal LuckyCharms = new Cereal("Lucky Charms");
        
        System.out.println(frostedFlakes.getName());

    }
}
    import java.io.*;
    public class Cereal {
    //static variables
    private static String name;
    
    //constructor
    Cereal(String name){
        this.name = name;
    }
    
    //accessor methods
    public static String getName(){
        return name;
    }
    
    }

我想也许我编写构造函数或编写变量的方式有问题,所以我对两者都进行了实验,但得到了相同的结果。

Java 对象 方法 构造函数

评论

0赞 tgdavies 4/12/2023
name不应该是 .这意味着在 的所有实例中,该变量只有一个实例。staticCereal
0赞 Anand Dwivedi 4/12/2023
name 应为实例变量,以便更新和维护多个副本而不是单个副本
0赞 Karl Knechtel 4/12/2023
用你自己的话来说,代码说,你期望这意味着什么?特别是,你期望做什么?private static String name;static

答:

0赞 Z-100 4/12/2023 #1

构造函数和一切都很好,但你不应该声明为变量。
这是因为静态变量在类的所有实例(对象)上都是“共享”*的;因此是静态的 -> 在您的实例中,这意味着,一旦您设置了“name”,它将在所有实例之间共享
namestaticCereal

*此处共享仅意味着,该特定变量只有一个实例,在该类的所有对象之间共享。

要使代码“正常工作”,只需从变量名称中删除关键字即可。
这会从变量中删除 one-instance-across-everything 属性,并使其成为“特定于对象”的属性。
static

几乎没有其他信息:您通常只想声明变量,当它们是全局属性或值时,这些变量或值不会特定于对象,例如static

private static final int MAX_LENGTH_TEXT = 425

希望这有帮助!干杯