Разница между ссылкой на класс и интерфейсом - PullRequest
0 голосов
/ 23 апреля 2011

Мой код:

class Sample implements interf {
    public void intmethod(){ //some code.... }
} 

public interface interf{ public void intmethod() }

Мой вопрос: в чем разница между следующими двумя утверждениями

Sample sam = new Sample();
interf int = new Sample();

Ответы [ 5 ]

2 голосов
/ 23 апреля 2011

Допустим, у вас есть:

class Sample implements interf {
    public void intmethod(){ //some code.... }
    public void sampleMethod() { // code only relevant to Sample objects}
} 

class Sample2 implements interf {
    public void intmethod(){ //some code.... }
    public void sample2Method() { // code only relevant to Sample2 objects }
} 

public interface interf{ public void intmethod() }

Вы сможете сделать:

Sample sam = new Sample();
interf intObj = new Sample();
Sample2 sam2 = new Sample2();

sam.intmethod();
sam.sampleMethod();
intObj.intmethod();
// the las one will give you an erro because sampleMethod is not defined for interf
//intObj.sampleMethod()
sam.intmethod();
sam2.sampleMethod2();

но определение объектов interf позволит вам сделать это:

List<interf> myList = new ArrayList<interf>();

myList.add(sam);
myList.add(intObj);
myList.add(sam2);

for (obj : myList) {
    obj.intmethod();
}

Страницы учебника Oracle по интерфейсам и полиморфизму:

http://download.oracle.com/javase/tutorial/java/concepts/interface.html

http://download.oracle.com/javase/tutorial/java/IandI/polymorphism.html

В Википедии есть несколько интересных примеров на нескольких языках:

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

1 голос
/ 23 апреля 2011

С Sample sam = new Sample(); у вас есть ссылка типа Sample, и вы можете работать с sam так, как определяет класс Sample.

С interf int = new Sample();, хотя у вас есть объект типа Sample, вы можете работать с ним только так, как определяет interf (например, методы, доступные в Sample, но не объявленные в interf нельзя вызвать, не приведя ссылку на Sample). Но вы сможете использовать его везде, где ожидается interf, независимо от базовой реализации.

Вторая форма обычно предпочтительнее, поскольку вы можете поменять базовую реализацию позже, не беспокоясь о рефакторинге всего вашего кода.

См. Дополнительные обсуждения по использованию интерфейсов и классов реализации:

0 голосов
/ 23 апреля 2011

Интерфейс обеспечивает базу для конкретных классов. Он определяет контракт, который должен быть полностью заполнен реализующими классами. Так что его можно использовать полностью в случае, если вам нужен полиморфизм. например, если у вас есть несколько классов и интерфейс, например:

interface Doctor{   void doCheckUp();   }  

class HumanDoctor implements doctor{  

public void doCheckUp(){  
    //checkup code here   }

public doHumanRelatedStuff(){   // Human Related Stuff   }  
   }  

class AnimalDoctor implements doctor{   public void doCheckUp(){   //checkup code here   }  

public doAnimalRelatedStuff(){   // Animal Related Stuff   }   }

Здесь, если вы хотите выполнить какую-то общую работу, которая является общей для обоих врачей (doCheckUp), вы должны использовать интерфейс, подобный

 public void routineChecup(Doctor d){  
     d.doCheckUp();  
 }    

В этом случае, независимо от того, какой объект вы передаете, он вызовет метод doCheckUp соответствующего объекта. Но ваш конкретный класс может иметь несколько дополнительных методов, и если вы хотите использовать эти методы, вам нужно вызывать методы, используя соответствующие конкретные объекты класса.

Итак, если вы хотите использовать общие общие методы, вы должны использовать экземпляр интерфейса.

0 голосов
/ 23 апреля 2011
Sample sam = new Sample(); 

позволяет получить доступ ко всем методам класса Sample.

interf int = new Sample();  

позволяет получить доступ только к тем методам интерфейса.

0 голосов
/ 23 апреля 2011

Одна ссылка позволит вам вызывать методы, объявленные в классе, другая - вызывать методы, объявленные в интерфейсе.В этом очень простом случае, когда в Sample используются только методы, определенные в interf, это не должно иметь для вас никакого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...