Следуйте за сообщением Мишеля. Я сам сделал себе еще один пример, чтобы объяснить это. Я надеюсь, что это могло бы помочь.
public static void main(String[] args){
MyParam myParam = thisIsWhy(new MyObj());
myParam.setArgNewName();
System.out.println(myParam.showObjName());
}
public static MyParam thisIsWhy(final MyObj obj){
MyParam myParam = new MyParam() {
@Override
public void setArgNewName() {
obj.name = "afterSet";
}
@Override
public String showObjName(){
return obj.name;
}
};
return myParam;
}
public static class MyObj{
String name = "beforeSet";
public MyObj() {
}
}
public abstract static class MyParam{
public abstract void setArgNewName();
public abstract String showObjName();
}
Из приведенного выше кода в методе thisIsWhy () мы фактически не присвоили [аргумент MyObj obj] реальную ссылку в MyParam. Вместо этого мы просто используем [аргумент MyObj obj] в методе внутри MyParam.
Но после завершения метода thisIsWhy (), должен существовать аргумент (объект) MyObj?
Похоже, должно быть, потому что мы можем видеть в основном, мы все еще вызываем метод showObjName (), и ему нужно достичь obj. MyParam все еще использует / достигает аргумента метода, даже если метод уже возвращался!
Как Java действительно достигает этого - сгенерировать копию, также является скрытой ссылкой аргумента MyObj obj внутри объекта MyParam (но это не формальное поле в MyParam, так что мы не можем его увидеть)
Как мы называем «showObjName», он будет использовать эту ссылку для получения соответствующего значения.
Но если мы не представим аргумент final, что приведет к ситуации, мы можем переназначить новая память (объект) к аргументу MyObj obj.
Технически нет никакого столкновения! Если нам будет позволено это сделать, ниже будет ситуация:
Нет столкновения, но «CONFUSING! !» Потому что все они используют одно и то же «ссылочное имя», которое является «obj».
Чтобы избежать этого, установите его как «final», чтобы программатор не выполнял «код, подверженный ошибкам».
Здравствуйте, вы пытались сделать
Display.displayImage();
ваш созданный экземпляр ImageFileHandler называется Display, поэтому используйте его следующим образом: Display.displayImage();