Я озадачен некоторым исходным кодом, на который я смотрю, и я пытаюсь получить лучшее понимание. Код ниже, но он также доступен at Ideone, где вы можете играть с ним самостоятельно.Определение внутреннего интерфейса в Java как переменной экземпляра для класса
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public interface Fruit {
public void apple();
}
Fruit interfaceFruit;
public void apple(){
System.out.println("apple");
if (interfaceFruit != null) {
interfaceFruit.apple();
}
}
public void setFruit(Fruit f) {
interfaceFruit = f;
}
public static void main (String[] args) throws java.lang.Exception
{
Ideone test = new Ideone(){
@Override
public void apple() {
System.out.println("local override of apple");
}
};
System.out.println("1) ---");
test.apple();
Ideone test2 = new Ideone();
System.out.println("2) ---");
test2.apple();
test2.setFruit(new Fruit() {
@Override
public void apple() {
System.out.println("interface override of apple");
}
});
System.out.println("3) ---");
test2.apple();
}
}
Выход:
1) ---
local override of apple
2) ---
apple
3) ---
apple
interface override of apple
Что именно происходит в этом коде? Существует интерфейс, объявленный внутри класса (так, внутренний интерфейс, правильно?), А затем интерфейс объявляется как переменная экземпляра для класса. Здесь я смущен.
Я думаю, что происходит то, что если анонимный внутренний класс создается для интерфейса Fruit
, мы создаем неназванный класс, который реализует интерфейс. Я не полностью понимаю, как и почему интерфейс хранится в переменной экземпляра класса. Какова цель этого? Как называется эта практика? Это кажется очень странным, и я не совсем уверен, что кто-то уберется от этого.
Связанный: http://stackoverflow.com/questions/71625/why-would-a-static-inner-interface-be-used-in-java – jaco0646
Интерфейс ** не ** хранится в переменной. Переменная объявляется как интерфейс ** type **. –
Важно помнить о интерфейсах, которые для них являются лишь лексикой, другими словами: вложенные интерфейсы всегда неявно «статичны». Строка, которую вы задаете, представляет собой просто объявление поля и полностью не зависит от декларации интерфейса. Вы можете переместить свой интерфейс в отдельный исходный файл, и вы все равно можете объявить поле типа «Фрукты». – biziclop