2016-05-04 3 views
-5

При построении и интерфейсе, сколько классов может реализовать интерфейс?
Если ответ более одного, то как java знает, какие реализации использовать, когда вы совершаете вызов интерфейса (не вызывая реализацию напрямую)?Концепция интерфейса Java

+3

Вы говорите Java, какую реализацию он должен использовать! – user2004685

+0

Когда вы используете 'import', вы указываете Java, какую реализацию использовать. – MaxG

+0

Неограниченное число может реализовать интерфейс и задавать конкретный тип при установке ссылки. –

ответ

0

Сколько классов может реализовать интерфейс?

Столько, сколько вам нужно.

Если ответ более одного, то как java знает, какие реализации использовать при выполнении вызова интерфейса (не вызывающего реализацию напрямую)?

Здесь приводится информация о late binding (также известная как динамическое связывание).

Допустим, что у вас есть интерфейс и классы, которые реализуют его как

interface Animal{ 
    void makeSound(); 
} 

class Cat implements Animal{ 
    public void makeSound(){ 
     System.out.println("mew"); 
    } 
} 

class Dog implements Animal{ 
    public void makeSound(){ 
     System.out.println("woof"); 
    } 
} 

У вас также есть код, как

Animal a1 = new Cat(); 
Animal a2 = new Dog(); 

a1.makeSound(); 
a2.makeSound(); 

результат, который вы увидите в

mew 
woof 

Это происходит потому что тело/код метода .makeSound() ищет (и вызывается) во время выполнения (не время компиляции). Это возможно, потому что каждый объект запоминает свой класс, поэтому объект, содержащий ссылку a1, знает, что это экземпляр Cat, а объект, хранящийся a2, является экземпляром Dog.

Короче говоря, когда вы делаете:

a1.makeSound(); 
  • JVM принимает объект, который держит a1,
  • спрашивает, что объект о своем классе (в этом случае он будет узнать, что это экземпляр Cat class),
  • затем он обратится к этому классу (Cat.class файл) и ищет код makeSound() (если такой метод не будет найден, он предположит, что он должен быть унаследован, он будет пытаться закрепите его в суперклассе)
  • , и когда он найдет этот метод, он выведет код из него.
+0

Очень хорошо сказано. Спасибо. – MarkoRocko

+0

@MarkoRocko Добро пожаловать. Я забыл добавить, что благодаря этому механизму мы имеем полиморфизм в Java. Также есть три исключения из динамической привязки, когда вы вызываете '.someMethod()'.Первое исключение, когда код задается во время компиляции и не выполняется динамически во время выполнения, - это когда метод является «final» (поскольку он не может быть переопределен, поэтому нет смысла в * поиске * его во время выполнения). Второй случай - когда метод 'private' (поскольку частные методы доступны только внутри класса, который объявляет и получает доступ к приватным методам из других классов, невозможно). – Pshemo

+0

@MarkoRocko Третий случай, когда метод 'статический', потому что' reference.staticMethod() 'находится во время компиляции, изменен на' ReferenceType.staticMethod() '. – Pshemo

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