Почему m c не может получить доступ к do1 и d2 без приведения?
Может, при условии, что вы вызываете mc.do1()
или mc.do2()
из класса в том же пакете, где MyClass объявлен. В Java, когда вы не объявляете модификатор доступа для метода или поля, Java позволяет ему быть доступным только в том же «пакете», где объявлен класс. Чтобы do1 () и do2 () были доступны где угодно, объявите их с помощью publi c 'modifier':
public void do1() {
...
}
Примечание. Это не применимо для интерфейсов, так как все методы в интерфейсах по умолчанию 'publi c', даже если ключевое слово не указано.
Почему mi не может получить доступ к do3 без приведения?
Вот как устроен Java. Интерфейс определяет контракт ( что , а не как ). Поэтому, когда класс реализует интерфейс, он должен придерживаться этого контракта, плюс он может объявлять свои собственные функции. Но пока вы ссылаетесь на объект класса реализации со ссылкой на интерфейс:
MyInterface mi = new MyClass();
ссылка на интерфейс будет иметь доступ только к объявленному методу. Другими словами, ссылка на интерфейс может сказать только то, что она «знает наверняка», присутствует в реализации (так как класс реализации реализовал интерфейс), а не другие функциональные возможности (методы) класса реализации.