Реализует против расширяется: когда использовать? В чем же разница?
Пожалуйста, объясните на легком для понимания языке или со ссылкой на какую-нибудь статью.
15 ответов:
extendsэто для расширяющего класса.Разница между интерфейсом и обычным классом заключается в том, что в интерфейсе нельзя реализовать ни один из объявленных методов. Только класс, который "реализует" интерфейс, может реализовать методы. Эквивалентом интерфейса на языке C++ будет абстрактный класс (не совсем такой же, но в значительной степени).
implementsявляется для реализацией интерфейсаТакже java не поддерживает множественное наследование на занятия. Это решается с помощью нескольких интерфейсов.
public interface ExampleInterface { public void doAction(); public String doThis(int number); } public class sub implements ExampleInterface { public void doAction() { //specify what must happen } public String doThis(int number) { //specfiy what must happen } }Теперь расширяем класс
public class SuperClass { public int getNb() { //specify what must happen return 1; } public int getNb2() { //specify what must happen return 2; } } public class SubClass extends SuperClass { //you can override the implementation @Override public int getNb2() { return 3; } }В данном случае
Subclass s = new SubClass(); s.getNb(); //returns 1 s.getNb2(); //returns 3 SuperClass sup = new SuperClass(); sup.getNb(); //returns 1 sup.getNb2(); //returns 2Я предлагаю вам провести еще несколько исследований по динамическому связыванию, полиморфизму и вообще наследованию в объектно-ориентированном программировании
Я заметил, что у вас в профиле есть несколько вопросов на C++. Если вы понимаете концепцию множественного наследования от C++ (относящегося к классам, которые наследуют характеристики от более чем одного другого класса), Java не позволяет этого, но у него есть ключевое слово
Эти ключевые слова и правила, регулирующие их использование, определяют возможности множественного наследования в Java (вы можете иметь только один суперкласс, но вы можете реализовать несколько интерфейсов).interface, которое является своего рода чистым виртуальным классом в C++. Как упоминалось многими людьми, выextendкласс (и вы можете расширяться только из одного), и выimplementинтерфейс - но ваш класс может реализовать столько интерфейсов, сколько вам нравится.
extendsиспользуется, когда вы наследуете от базового класса (т. е. расширяете его функциональность).
implementsпредназначен для реализации интерфейса .Вот хорошее место для начала: интерфейсы и наследование.
A
classможет только "реализовать" aninterface. Класс только "расширяет" aclass. Аналогично,interfaceможет расширить другойinterface.A
classможет расширить только один другойclass. Aclassможет реализовать несколькоinterfaces.Если вместо этого вы больше заинтересованы в том, чтобы знать, когда использовать
abstract classes иinterfaces, обратитесь к этому потоку: Interface vs Abstract Class (general OO)
Обычно реализует, используемый для реализации интерфейса и расширяет, используемый для расширения поведения базового класса или абстрактного класса.
Extends : производный класс может расширять базовый класс. Вы можете переопределить поведение установившегося отношения. Производный класс "это а" тип базового класса
Implements : вы реализуете контракт. Класс, реализующий интерфейс "имеет a" способность.
С выпуском java 8 интерфейс может иметь методыdefault в интерфейсе, что обеспечивает реализацию в самом интерфейсе.
Обратитесь к этому вопросу, когда использовать каждый из них:
Интерфейс vs абстрактный класс (general OO)
Пример для понимания вещей.
public class ExtendsAndImplementsDemo{ public static void main(String args[]){ Dog dog = new Dog("Tiger",16); Cat cat = new Cat("July",20); System.out.println("Dog:"+dog); System.out.println("Cat:"+cat); dog.remember(); dog.protectOwner(); Learn dl = dog; dl.learn(); cat.remember(); cat.protectOwner(); Climb c = cat; c.climb(); Man man = new Man("Ravindra",40); System.out.println(man); Climb cm = man; cm.climb(); Think t = man; t.think(); Learn l = man; l.learn(); Apply a = man; a.apply(); } } abstract class Animal{ String name; int lifeExpentency; public Animal(String name,int lifeExpentency ){ this.name = name; this.lifeExpentency=lifeExpentency; } public void remember(){ System.out.println("Define your own remember"); } public void protectOwner(){ System.out.println("Define your own protectOwner"); } public String toString(){ return this.getClass().getSimpleName()+":"+name+":"+lifeExpentency; } } class Dog extends Animal implements Learn{ public Dog(String name,int age){ super(name,age); } public void remember(){ System.out.println(this.getClass().getSimpleName()+" can remember for 5 minutes"); } public void protectOwner(){ System.out.println(this.getClass().getSimpleName()+ " will protect owner"); } public void learn(){ System.out.println(this.getClass().getSimpleName()+ " can learn:"); } } class Cat extends Animal implements Climb { public Cat(String name,int age){ super(name,age); } public void remember(){ System.out.println(this.getClass().getSimpleName() + " can remember for 16 hours"); } public void protectOwner(){ System.out.println(this.getClass().getSimpleName()+ " won't protect owner"); } public void climb(){ System.out.println(this.getClass().getSimpleName()+ " can climb"); } } interface Climb{ public void climb(); } interface Think { public void think(); } interface Learn { public void learn(); } interface Apply{ public void apply(); } class Man implements Think,Learn,Apply,Climb{ String name; int age; public Man(String name,int age){ this.name = name; this.age = age; } public void think(){ System.out.println("I can think:"+this.getClass().getSimpleName()); } public void learn(){ System.out.println("I can learn:"+this.getClass().getSimpleName()); } public void apply(){ System.out.println("I can apply:"+this.getClass().getSimpleName()); } public void climb(){ System.out.println("I can climb:"+this.getClass().getSimpleName()); } public String toString(){ return "Man :"+name+":Age:"+age; } }Вывод:
Dog:Dog:Tiger:16 Cat:Cat:July:20 Dog can remember for 5 minutes Dog will protect owner Dog can learn: Cat can remember for 16 hours Cat won't protect owner Cat can climb Man :Ravindra:Age:40 I can climb:Man I can think:Man I can learn:Man I can apply:ManВажные моменты для понимания:
Пройдя через эти примеры, вы можете понять, что
- собака и кошка являются животными, и они расширяются
remember() иprotectOwner(), разделяяname,lifeExpentencyотAnimal- Кошка может лазить (), а собака-нет. Собака может думать (), а кошка-нет . Эти специфические возможности добавляются к
CatиDogпутем реализации этой возможности.- человек не животное, но он может
Think,Learn,Apply,Climbнесвязанные классы могут иметь возможности через интерфейс, но связанные классы переопределяют поведение посредством расширения базовых классов.
Интерфейс-это описание действий, которые может выполнять объект... например, когда вы щелкаете выключателем, свет загорается, вам все равно, как, просто это происходит. В объектно-ориентированном программировании интерфейс-это описание всех функций, которые объект должен иметь, чтобы быть "X". Опять же, в качестве примера, все, что "действует как" свет, должно иметь метод turn_on() и метод turn_off (). Назначение интерфейсов-позволить компьютеру принудительно применять эти свойства. и чтобы знать, что объект типа T (каким бы ни был интерфейс ) должен иметь функции, называемые X, Y, Z и т. д.
Интерфейс-это структура/синтаксис программирования, которая позволяет компьютеру применять определенные свойства к объекту (классу). Например, скажем, у нас есть класс автомобилей, класс скутеров и класс грузовиков. Каждый из этих трех классов должен иметь действие start_engine (). То, как "запускается двигатель" для каждого транспортного средства, остается за каждым конкретным классом, но тот факт, что они должны иметь действие start_engine является областью интерфейса .
расширяет : это используется для получения атрибутов родительского класса в базовый класс и может содержать уже определенные методы, которые могут быть переопределены в дочернем классе.
орудия труда : это используется для реализации интерфейса (родительский класс с функциями сигнатур только, но не их определений), определяя его в дочернем классе.
Существует одно особое условие: "что, если я хочу, чтобы новый интерфейс был дочерним по отношению к существующему интерфейсу?". В в приведенном выше условии дочерний интерфейс расширяет Родительский интерфейс.
A расширяет B:
A и B - оба класса или оба интерфейса
A реализует B
A-Класс, А B-интерфейс
Оставшийся случай, когда A-интерфейс, А B-класс, не является законным в Java.
Implements используется для интерфейсов, а extends - для расширения класса.
Чтобы сделать его более ясным в более простых терминах,интерфейс, как это звучит-интерфейс-модель,которую вы должны применить, следовать, вместе с вашими идеями к нему.
Extend используется для классов,здесь вы расширяете то,что уже существует, добавляя к нему больше функциональности.
Еще несколько примечаний:
Интерфейс может расширять другой интерфейс.
И когда вам нужно выбрать между реализацией интерфейса или расширением класса для конкретного сценария перейдите к реализации интерфейса. Потому что класс может реализовать несколько интерфейсов, но расширить только один класс.
Когда подкласс расширяет класс, он позволяет подклассу наследовать (повторно использовать) и переопределять код, определенный в супертипе. Когда класс реализует интерфейс, он позволяет объекту, созданному из класса, использоваться в любом контексте, который ожидает значение интерфейса.
Реальная загвоздка здесь заключается в том, что, когда мы реализуем что-либо, это просто означает, что мы используем эти методы как есть. Нет возможности для изменения их значений и типов возвращаемых данных.Но когда мы расширяя что-либо, тогда это становится расширением вашего класса. Вы можете изменить его, использовать его, повторно использовать его, и он не обязательно должен возвращать те же значения, что и в суперклассе.
Оба ключевых слова используются при создании собственного нового класса на языке Java.
Отличие:
implementsозначает, что вы используете элементы интерфейса Java в своем классе.extendsозначает, что вы создаете подкласс базового класса, который вы расширяете. Вы можете расширить только один класс в своем дочернем классе, но вы можете реализовать столько интерфейсов, сколько захотите.Обратитесь к документации oracle на странице interface для получения более подробной информации.
Это может помочь разъясните, что такое интерфейс и соглашения, связанные с их использованием.
В самых простых терминах extends используется для наследования от класса и implements используется для применения интерфейса в вашем классе
Extends:
public class Bicycle { //properties and methods } public class MountainBike extends Bicycle { //new properties and methods }Реализует :
public interface Relatable { //stuff you want to put } public class RectanglePlus implements Relatable { //your class code }Если у вас все еще есть путаница, прочитайте это: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
Мы используем подкласс расширяет суперкласс только тогда, когда подкласс хочет использовать некоторую функциональность (методы или переменные экземпляра), которая уже объявлена в суперклассе, или если я хочу немного изменить функциональность суперкласса (переопределение метода). Но скажем, например, у меня есть класс животных (суперкласс) и класс собак ( подкласс), и есть несколько методов, которые я определил в классе животных, например. doEat (); , doSleep ();... и многое другое.
Теперь мой класс Dog может просто расширить класс Animal, если я хочу, чтобы моя собака использовала любой из методов, объявленных в классе Animal, я могу вызвать эти методы, просто создав объект Dog. Таким образом, я могу гарантировать, что у меня есть собака, которая может есть, спать и делать все, что я хочу, чтобы собака делала. Теперь представьте себе, что однажды в наше рабочее пространство приходит любитель кошек и пытается расширить класс животных (кошки также едят и спят). Она создает объект Cat и начинает вызывать методы. Но, скажем, кто-то пытается сделать объект из класса животных. Вы можете сказать, как спит кошка, вы можете сказать, как ест собака, вы можете сказать, как пьет слон. Но это не имеет никакого смысла в создании объекта класса животных. Потому что это шаблон, и мы не хотим никакого общего способа питания.Поэтому вместо этого я предпочту сделать абстрактный класс, который никто не может создать, но может быть использован в качестве шаблона для других занятия.
Таким образом, интерфейс-это не что иное, как абстрактный класс(чистый абстрактный класс), который не содержит реализаций методов, а только определения(шаблоны). Поэтому тот, кто реализует интерфейс, просто знает, что у них есть шаблоны doEat (); и doSleep (); но они должны определить свои собственные doEat (); и doSleep (); методы в соответствии с их потребностями.
Вы расширяете только тогда, когда хотите повторно использовать некоторую часть суперкласс (но имейте в виду, что вы всегда можете переопределить методы вашего суперкласса в соответствии с вашими потребностями) и вы реализуете, когда вам нужны шаблоны, и вы хотите определить их самостоятельно(в соответствии с вашими потребностями).
Я поделюсь с вами фрагментом кода: Вы попробуете его с различными наборами входных данных и посмотрите на результаты.class AnimalClass { public void doEat() { System.out.println("Animal Eating..."); } public void sleep() { System.out.println("Animal Sleeping..."); } } public class Dog extends AnimalClass implements AnimalInterface, Herbi{ public static void main(String[] args) { AnimalInterface a = new Dog(); Dog obj = new Dog(); obj.doEat(); a.eating(); obj.eating(); obj.herbiEating(); } public void doEat() { System.out.println("Dog eating..."); } @Override public void eating() { System.out.println("Eating through an interface..."); // TODO Auto-generated method stub } @Override public void herbiEating() { System.out.println("Herbi eating through an interface..."); // TODO Auto-generated method stub } }Определенные Интерфейсы :
public interface AnimalInterface { public void eating(); } interface Herbi { public void herbiEating(); }
Как показано на рисунке ниже, класс расширяет другой класс, интерфейс расширяет другой интерфейс, но класс реализует интерфейс.
Подробнее Подробнее
Extendsиспользуется, когда вы хотите атрибуты родительского класса/интерфейса в вашем дочернем классе/интерфейсе иimplementsиспользуется, когда вы хотите атрибуты интерфейса в вашем классе.Пример:
расширяется с помощью класса
Класс Родитель {
}
Класс Child расширяет Родительский{
}
расширяется с помощью интерфейса
Родительский Интерфейс {
}
Дочерний интерфейс расширяется Родитель{
}
орудия труда
Интерфейс A {
}
Класс B реализует A{
}
комбинация расширений и реализаций
interface A{ } class B { } class C implements A,extends B{ }
