2015-06-07 2 views
0

Изображение у нас есть некоторый класс, например Square.class и интерфейс Shape с методом calculate(). Класс Square реализует интерфейс Shape, и вот мой вопрос. В каком-то другом классе, где у нас есть основной метод, я хочу создать экземпляр квадрата и использовать метод вычисления. В чем разница между этими типами, например:Разница между экземпляром класса или интерфейса

Square square = new Square(); 
Shape square = new Square(); 
+0

Читайте на интерфейсах https://docs.oracle.com/javase/tutorial/java/concepts/interface.html, затем прочитайте о полиморфизме https://docs.oracle.com/javase/tutorial/java/ IandI/polymorphism.html – Shar1er80

+0

Возможный дубликат [Почему переменные объявлены с их именем интерфейса в Java?] (Http://stackoverflow.com/questions/1484445/why-are-variables-declared-with-their-interface-name -в-Java) – shmosel

ответ

1

Когда вы объявляете переменную, как

Shape square = new Square(); 

вы программирования интерфейса, который является хорошей вещью, потому что разъединяет код который использует переменную square от подробности реализации.

В будущем вы можете придумать лучшую реализацию Shape, например. EnhancedSquare. Когда это произойдет, вам не нужно менять код, который использует square, потому что ваш код не привязан к классу внедрения (Square).

1

Единственное различие будет происходить в байткод:

Square square = new Square(); 
square.calculate(); 

использует invokevirtual для вызова метода calculate,

Shape square = new Square(); 
square.calculate(); 

использует invokeinterface.

Но обе версии ссылаются на тот же метод.

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