#java
#java
Вопрос:
Я новичок в Java, надеюсь, этот вопрос не слишком простой. Мне трудно понять, зачем нужны интерфейсы и в чем разница между реализацией и наследованием.
Если я хотел бы использовать метод Comparable в своей программе, (java.lang.Comparable)
почему я не могу просто заставить свой класс наследовать от Comparable
?
public class Main {
public static void main(String[] args) {
class DocumentReader extends Comparable;
Почему IntelliJ сообщает «здесь не ожидается интерфейса»?
Ответ №1:
Грубо говоря, и не совсем точно, начиная с JDK 8… но хорошо для понимания основ.
Интерфейс — это спецификация методов, которыми должен обладать класс, реализующий интерфейс. Интерфейс не предоставляет реализации. Таким образом, утверждение, что ваш класс «реализует Comparable», накладывает на него обязательство предоставить метод compareTo с определенной сигнатурой.
Класс может содержать фактические реализации метода и, возможно, данные-члены. Расширение класса — это, по сути, специализация этого класса. Вы получаете все, что делает базовый класс, который вы, возможно, можете модифицировать (переопределяя базовые методы) или дополнять (добавляя новые методы).
ЗА исключением того, что существуют такие вещи, как абстрактные методы, где базовый класс не предоставляет реализации и, таким образом, вынуждает расширяющий класс предоставлять реализацию.
Таким образом, с одной точки зрения, вы могли бы рассматривать интерфейс как абстрактный класс, в котором все методы абстрактны. Это было бы выполнимо, за исключением того, что Java позволяет классу расширять только один класс (нет ‘class X расширяет A, B’), но класс может реализовать более одного интерфейса (‘class X реализует A, B’ — мой синтаксис может быть неточным). Существует техническая причина ограничения на наследование от нескольких классов, но я пропущу это здесь.
Как я заметил в начале, это не совсем верно по отношению к JDK 8 — в интерфейсах есть «методы по умолчанию», поэтому строка становится немного размытой.
Я бы рассматривал интерфейс как спецификацию для типов разъемов, которые должен предоставлять объект, если он должен подключаться к другим объектам стандартными способами. Вы хотите, чтобы ваши объекты «сравнивались», чтобы они могли быть расположены по порядку другими компонентами? Затем вы должны реализовать Comparable.
Ответ №2:
я пытаюсь объяснить программно. Extends : Когда вы хотите расширить подкласс, который будет расширяться при наследовании, мы используем Java extends. Implements: При реализации интерфейса мы используем ключевое слово implementate.
Расширение против реализаций : короче говоря, extends предназначен для расширения класса, а implements — для реализации интерфейса.
Поскольку Java не поддерживает множественное наследование, и эта проблема решается несколькими интерфейсами.
Расширяет:
class Person
{
String name;
Person(String n)
{
name = "Person: " n;
}
}
class Mother extends Person
{
Mother(String n)
{
super(n);
name = "Mother: " n;
}
void FeedChildren()
{
System.out.println(name " is feeding the kids ...");
}
}
class Wife extends Person
{
Wife(String n)
{
super(n);
name = "Wife: " n;
}
void CallHusband()
{
System.out.println(name " is calling the husband ...");
}
}
public class Test
{
public static void main(String args[])
{
Person p = new Person("Prerna");
Mother m = new Mother("Mahima");
Wife w = new Wife("Raani");
System.out.println("p is a " p.name);
System.out.println("m is a " m.name);
System.out.println("w is a " w.name);
m.FeedChildren();
w.CallHusband();
}
}
Здесь базовым классом является Person, Mother и Wife, но когда жена и Мать одинаковы, это один и тот же человек, и это тот человек, о котором мы говорим.
Реализует
class Person
{
String name;
Person(String n)
{
name = "Person: " n;
}
}
interface Mother
{
public void FeedChildren();
}
interface Wife
{
public void CallHusband();
}
class WifeAndMother extends Person implements Wife, Mother
{
WifeAndMother(String n)
{
super(n);
name = "Wife and mother: " n;
}
public void FeedChildren()
{
System.out.println(name " is feeding the children.");
}
public void CallHusband()
{
System.out.println(name " is calling her husband.");
}
}
public class Test
{
public static void main(String args[])
{
Person p = new Person("Prerna");
WifeAndMother w = new WifeAndMother("Raani");
System.out.println("p is a " p.name);
System.out.println("w is a " w.name);
w.FeedChildren();
w.CallHusband();
}
}
Ответ №3:
Вы можете расширяться только из одного класса и реализовывать несколько интерфейсов.