MyInterface myObj = new Obj();
MyInterface mySec = new Sec();
Для того, чтобы это было законно, оба Obj
и Sec
должны быть реализациями MyInterface
.Разница между этими двумя объектами будет как они обеспечивают эту реализацию.Obj
и Sec
могут делать две очень разные или очень похожие вещи, но их общность заключается в том, что они будут придерживаться контракта, на который вы могли бы положиться.Предположим, у вас есть метод
public void doSomethingWith(MyInterface thing) {
thing.frob();
}
Каждый объект, myObj
и mySec
, может быть передан в этот метод, и этот метод может затем использовать метод frob
этого объекта (предполагая, что frob является частьюобъявление интерфейса).Это освобождение .Это позволяет вам делать очень мощные вещи, программируя для интерфейсов, а не для реализаций.Например, вы можете расширить функциональность классов и не изменять строку кода в этих классах, вы просто пропускаете другую реализацию зависимости.Вы не связаны или не связаны с каким-либо одним внедрением внутри метода doSomethingWith
.
, но я также прочитал, что если мы объявим объект myObj как MyInterface, myObjне сможет использовать свои собственные методы (из класса Obj), верно ли это
Внутренне, экземпляры Obj
будут по-прежнему иметь полный доступ к Obj
API.myObj
по-прежнему Obj
, он всегда сможет использовать свои собственные детали реализации.
public interface MyInterface {
void frob();
}
public class Obj implements MyInterface {
public void frob() {
doFrobbing();
}
private void doFrobbing() {
System.out.println("frobbing");
}
public static void main(String[] args) {
MyInterface myObj = new Obj();
myObj.frob(); // still internally calls doFrobbing()
((Obj)myObj).doFrobbing(); // visible only via class reference
}
}
Экземпляры Obj
по-прежнему будут экземплярами Obj
, и эти экземпляры по-прежнему смогут использовать doFrobbing
.Внешне пользователи , использующие эти экземпляры через ссылку на интерфейс, смогут получить доступ только к методам интерфейса.