在 Java 中传递 Main 类和扩展的 Abstract 类之间的 Map

Passing a Map between Main class and and an extended Abstract class in Java

提问人:Chethan Swaroop 提问时间:11/4/2023 更新时间:11/4/2023 访问量:47

问:

我有一个 Main 类,其中声明了一个 Map,并将其作为对扩展 Abstract 类的类的引用传递

MainClass.java:
public class MainClass{
      private final Map<String, String> folderMap = new HashMap<>();
      
      public static void main() {   
         Tester testObj = new TesterImpl(folderMap);
         testObj.implementation();
         System.out.println(folderMap); //[key1,value1]
      }

}

Tester.java:
public abstract class Tester {

   public abstract void implementation();
}

TesterImpl.java:
public class TesterImpl extends Tester {
      private final Map<String, String> folderMap = new HashMap<>();
      
      public TesterImpl(Map<String, String> folderMap) {
          this.folderMap = folderMap;
      }
      
      public void implementation() {
          folderMap.put("key1","value1");
      }

}

问题是当我在 MainClass.java 中打印 folderMap 时,当我刚刚传递 folderMap 的引用时,它如何具有在 TesterImpl 类中添加的 folderMap 的值。

此外,这是实现跨类共享 folderMap 变量的最佳方式吗?如果没有任何关于更好方法的建议?

Java 抽象类 按引用传递

评论

0赞 PeterMmm 11/4/2023
阅读此 baeldung.com/...
0赞 Rifat Rubayatul Islam 11/4/2023
Java 是按值传递的。因此,您将值(实际的 HashMap 从 )传递给 ,然后将其分配给字段。MainClassTesterImplfolderMap
0赞 knittl 11/4/2023
两个字段都引用相同的映射(在构造函数中分配字段后)。抽象类在这里无关紧要。 赋值是多余的,因为它在构造函数中立即被覆盖... folderMap = new HashMap<>();

答:

1赞 Reilas 11/4/2023 #1

"...问题是当我在MainClass.java中打印folderMap时,当我只是传递folderMap的引用时,它如何具有在TesterImpl类中添加的folderMap的值。..."

可能,你的术语混淆了。

Object 数据类型传递给 TesterImpl,而不是基元数据类型
Java 中,将解析 Object 实例,而不是 Object 的内容或“值”。

相反,如果使用基元数据类型,则传递的是文本值,而不是地址“实例”。
因此,MainClass 值不受影响。

CC++Rust 等语言为原始数据类型提供了你所指的概念。

该主题通常称为引用”。

"...这是实现跨类共享 folderMap 变量的最佳方式。如果没有关于更好的建议吗?

最佳方法取决于 folderMap 的累积使用量。

如果是单个操作,我想你所拥有的是有效的。

否则,通过继承使 folderMap 可供 TesterImpl 使用。

class MainClass{
    Map<String, String> folderMap;

    public static void main(String[] args) {
        Tester testObj = new TesterImpl();
        testObj.implementation();
        System.out.println(folderMap); //[key1,value1]
    }

}

abstract class Tester extends MainClass {

    public abstract void implementation();
}

class TesterImpl extends Tester {
    public void implementation() {
        folderMap.put("key1","value1");
    }

}