在 Java 中的主类和扩展抽象类之间传递 Map

问题描述 投票:0回答:1

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

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 abstract-class pass-by-reference
1个回答
0
投票

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

可能您混淆了术语。

您正在将 Object data-type 传递给 TesterImpl,而不是 primitive data-type
Java 中,将解析 Object 实例,而不是 Object 的内容或 “值”

相反,如果您使用primitivedata-type,则传递文字值,而不是address“instance”
因此,MainClass值不会受到影响。

诸如 CC++Rust 之类的语言提供了您所指的概念,即 primitive data-types

该主题通常称为,引用

“...这是实现跨类共享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(); //[key1,value1]
    }

}

abstract class Tester extends MainClass {

    public abstract void implementation();
}

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

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