Это потому, что Java передает аргументы по значению , а не по ссылке. Что касается Java, то img
из loadImage
не имеет ничего общего с background
. Все, что вы сделали, это передали адрес какой-либо фоновой ссылке, а не саму ссылку background
. background
в основном сказал параметру img
: «Эй, укажите на то, на что я указываю».
Когда вы идете
img = ImageIO.read(new File(filepath));
Вы только что установили img
для ссылки на какой-то новый объект, но фон все равно будет ссылаться на то, на что он ссылался раньше.
Вместо этого вы должны вернуть BufferedImage и установить background
в возвращаемое значение, поэтому что-то вроде
public BufferedImage loadImage(String filepath) {
try {
return ImageIO.read(new File(filepath));
}
catch (IOException e) {
}
return null;
}
background = loadImage(path);
Этот предыдущий вопрос содержит немного больше информации о проблеме передачи по значению по сравнению с передачей по ссылке в Java. Лично, идея о значении передаваемых ссылок заняла у меня какое-то время, чтобы понять это, пока я не прочитал эту статью .
Надеюсь, это поможет.
Что касается вашего второго замечания о том, что img == background
возвращает true
, я не уверен, где вы проверяете это, но если вы проверите его до img = ImageIO...
, это вернет true, потому что img
и background
оба ссылаются на null
, так как они неинициализированы.
==
при работе с двумя объектами вернет true, если и только если они оба ссылаются на один и тот же объект в памяти, а не если они являются одной и той же точной ссылкой.