Почему работает следующий код?Являются ли интерфейсы обработаны как объекты?
interface I { }
class A implements I{
public String toString(){ return "in a"; }
}
class B extends A{
public String toString(){ return "in b"; }
}
B b = new B();
A a = b;
I i = a;
System.out.println(i);
System.out.println((B)a);
System.out.println(b);
Как вы можете видеть i
является допустимым параметром для println
метода. Зачем? Рассматривая типы параметров, принятые этим методом, только объект кажется релевантным.
Я искал ответ и нашел несколько соответствующих вещей here: "Ссылочных типов все наследуются от java.lang.Object классов, перечислений, массивов и интерфейсов всех ссылки. типы. "
Но также найдено следующее: «Наследуются ли интерфейсы от класса Object в Java?» и ответ: Нет, они этого не делают. И нет общего «корневого» интерфейса, неявно унаследованного всеми интерфейсами (как в случае с классами). (*)
Что это значит? Может кто-нибудь объяснить мне, почему интерфейс принят в качестве аргумента для функции println
?
Я полагаю, что дело здесь в том, что вы не можете передать объект через интерфейс, не имея самого объекта.
Но вопрос все еще остается. Почему компилятор принимает интерфейс в качестве параметра для этого метода?
Интерфейсы не наследуют 'Object', но любой экземпляр реализации любой интерфейс наследует' Object', поэтому имеет 'toString()' метод. –
Я полагаю, когда вы вызываете, System.out.println (....) передавая ему объект, компилятор будет вызывать его toString(), таким образом, в идеале мы передаем строку. –
@SashaSalauyou: Не знаю, какая актуальность 'toString' здесь ... –