первый вопрос: на самом деле во втором коде, когда вы каждый раз вызываете getexits, он возвращает другую мелкую копию (новый Hashmap). Мелкая копия - это другая копия выходов, где вы можете изменить только возвращенную карту, а не оригинальную, которую вы объявлено в классе Foo. Итак, foo.getexits () - это совершенно другая карта, которую вы возвращаете, она каждый раз модифицирует новую хэш-карту, а не временную или foo (временную). Если вы кодируете так,
temp.replace("A",10);
temp.remove("B");
foo.show();
вместо ,
foo.getExits().replace("A", 10);
foo.getExits().remove("B");
foo.show();
, тогда он напечатает тот же вывод, что и ваша первая программа (он также изменится). Вкратце, ваш второй код не изменяется, потому что каждый раз, когда вы возвращаете и модифицируете новую хэш-карту, которая не имеет отношения к temp.so, это не повлияет на ваш foo (temp).
второй вопрос: если вы действительно хотите чтобы не изменять что-либо в основном классе, вы можете написать следующий код в методе getexits () во второй программе:
return Collections.unmodifiableMap(exits);
и не изменять ничего во второй программе, как вы. он выдаст
java.lang.UnsupportedOperationException
всякий раз, когда вы захотите изменить, используя foo.getexits (), и не даст вам изменить это. Но вы все равно можете изменить temp отдельно, так как он не имеет отношения к методу getexits. новичок, как вы, но я постарался ответить на ваш вопрос с моим небольшим знанием. надеюсь, это поможет