Я получаю сообщение об ошибке при вызове метода из другого класса

Следуйте за сообщением Мишеля. Я сам сделал себе еще один пример, чтобы объяснить это. Я надеюсь, что это могло бы помочь.

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.

Технически нет никакого столкновения! Если нам будет позволено это сделать, ниже будет ситуация:

  1. Теперь у нас есть скрытая точка [MyObj obj] к [Память A в куче], теперь живущая в объекте MyParam.
  2. У нас также есть еще один [MyObj obj], который является аргументом, указывающим на [Память B в куче], теперь живущим в этом методе IsWhy.

Нет столкновения, но «CONFUSING! !» Потому что все они используют одно и то же «ссылочное имя», которое является «obj».

Чтобы избежать этого, установите его как «final», чтобы программатор не выполнял «код, подверженный ошибкам».

-3
задан 22 February 2019 в 16:28
поделиться

2 ответа

Здравствуйте, вы пытались сделать

Display.displayImage();
0
ответ дан marveshy 22 February 2019 в 16:28
поделиться

ваш созданный экземпляр ImageFileHandler называется Display, поэтому используйте его следующим образом: Display.displayImage();

0
ответ дан funkyjelly 22 February 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: