Ответ 1
Да, они скопированы, поэтому вам нужно объявить переменную как final. Таким образом, они гарантированно не изменятся после того, как была сделана копия.
Это разные поля для экземпляра, которые доступны, даже если они не являются окончательными. В этом случае внутренний класс получает ссылку на внешний экземпляр, который он использует для этой цели.
private Environment env; // a field does not have to be final
public void init() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
Во-вторых, какие-либо проблемы с производительностью, возникающие в результате этого?
По сравнению с чем? Вам нужно иметь поле или переменную для вашего внутреннего класса, чтобы работать, а копия - очень эффективный способ. Это всего лишь "мелкая" копия: просто ссылка на (в вашем примере) Скопирована среда, а не сама среда.