2014-11-30 3 views
2

Учитывая myClass ниже и не-статический метод run(), следующая строка кода является действительным:Вызов нестатический метод из другого нестатической метода

new myClass().move(); 

Однако, это справедливо:

move(); 

Я понимаю, что первая попытка (new myClass().move()) создает экземпляр класса, а затем вызывает метод на нем. Вторая попытка также делает то же самое, но неявно? Другими словами, две попытки действительно одинаковы? Если нет, то в чем принципиальная разница и какая из них предпочтительнее?

Похоже, комментарий ОскарРейса в сообщении here коснулся этого, но он не уточнил.

class myClass 
{ 
    void move() { 
     //...some code 
    } 
    void run() { 
     new myClass().move(); 
    } 
} 

Спасибо.

+1

Нестатические методы _belong_ к экземпляру объекта (исследуйте «это», чтобы узнать больше). Внимательно рассмотрите, какой экземпляр метод будет считать «этим» в вашем коде. –

+0

См. Http://stackoverflow.com/questions/3728062/what-is-the-meaning-of-this-in-java – Bogdan

ответ

1

Это не то же самое.

С помощью первого attemp new myClass().move(); вы создаете другой экземпляр своего класса, а затем вызываете метод в этом новом экземпляре.

Но во второй попытке move(); вы просто вызываете метод своего текущего экземпляра. вы уже инициализировали его. Это то же самое, что и this.move();

Вторая предпочтительна, потому что вы не создаете другой экземпляр своего класса, а используете текущий.

+0

Благодарим за то, что вы также коснулись «предпочтительного» метода, хотя предпочтительный вариант, вероятно, зависит от конкретного контекста. В контексте моего кода я согласен, что 'this.move()' кажется более эффективным. – sedeh

+0

@sedeh Уверен, что это зависит от контекста, но большую часть времени, если вы можете получить доступ к методу в текущем экземпляре, это предпочтительнее, чем создать новый экземпляр класса. –

1

Это не то же самое.

Если вы вызываете move();, вы выполняете метод в текущем экземпляре myClass (это то же самое, что и this.move();).

Если вы вызываете new myClass().move();, вы выполняете его в новом экземпляре myClass.

+0

Отлично! Я пропустил неявное использование 'this' в коде. – sedeh

Смежные вопросы