当前位置: 首页 > 面试题库 >

Java中的接口是什么?

孔厉刚
2023-03-14
问题内容

与这个问题相对应:Java中的接口是什么?


问题答案:

接口是抽象类的一种特殊形式,它不实现任何方法。在Java中,你可以这样创建一个接口:

interface Interface
{
    void interfaceMethod();
}

由于该接口无法实现任何方法,因此这意味着整个事物(包括所有方法)都是公共的和抽象的(Java术语中的抽象含义是“未由此类实现”)。因此,上面的接口与下面的接口相同:

public interface Interface
{
    abstract public void interfaceMethod();
}

要使用此接口,你只需要实现该接口。许多类可以实现一个接口,而一个类可以实现许多接口:

interface InterfaceA
{
     void interfaceMethodA();
}

interface InterfaceB
{
    void interfaceMethodB();
}

public class ImplementingClassA
    implements InterfaceA, InterfaceB
{
    public void interfaceMethodA()
    {
        System.out.println("interfaceA, interfaceMethodA, implementation A");
    }

    public void interfaceMethodB()
    {
        System.out.println("interfaceB, interfaceMethodB, implementation A");
    }
}

public class ImplementingClassB
    implements InterfaceA, InterfaceB
{
    public void interfaceMethodA()
    {
         System.out.println("interfaceA, interfaceMethodA, implementation B");
    }

    public void interfaceMethodB()
    {
        System.out.println("interfaceB, interfaceMethodB, implementation B");
    }
}

现在,如果你愿意,可以编写如下方法:

public void testInterfaces()
{
    ImplementingClassA u = new ImplementingClassA();
    ImplementingClassB v = new ImplementingClassB();
    InterfaceA w = new ImplementingClassA();
    InterfaceA x = new ImplementingClassB();
    InterfaceB y = new ImplementingClassA();
    InterfaceB z = new ImplementingClassB();

    u.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation A"
    u.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation A"
    v.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation B"
    v.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation B"
    w.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation A"
    x.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation B"
    y.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation A"
    z.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation B"
}

但是,你永远无法html" target="_blank">执行以下操作:

public void testInterfaces()
{
    InterfaceA y = new ImplementingClassA();
    InterfaceB z = new ImplementingClassB();

    y.interfaceMethodB(); // ERROR!
    z.interfaceMethodA(); // ERROR!
}

你无法执行此操作的原因是这种y类型interfaceA,并且没有interfaceMethodB()in interfaceA。同样,z是类型interfaceB,interfaceMethodA()in 中没有interfaceB

前面我提到过,接口只是抽象类的一种特殊形式。为了说明这一点,请看下面的代码。

interface Interface
{
    void abstractMethod();
}

abstract public class AbstractClass
{
    abstract public void abstractMethod();
}

你将以几乎完全相同的方式从这些类继承:

public class InheritsFromInterface
    implements Interface
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

public class InteritsFromAbstractClass
    extends AbstractClass
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

实际上,你甚至可以像这样更改接口和抽象类:

interface Interface
{
    void abstractMethod();
}

abstract public class AbstractClass
    implements Interface
{
    abstract public void abstractMethod();
}

public class InheritsFromInterfaceAndAbstractClass
    extends AbstractClass implements Interface
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

但是,接口和抽象类之间有两个区别。

第一个区别是html" target="_blank">接口无法实现方法。

interface Interface
{
    public void implementedMethod()
    {
        System.out.println("implementedMethod()");
    }
}

上面的接口会生成编译器错误,因为它具有的实现implementedMethod()。如果你想实现该方法但不能实例化该类,则必须这样做:

abstract public class AbstractClass
{
    public void implementedMethod()
    {
        System.out.println("implementedMethod()");
    }
}

那不是一个抽象类,因为它的成员都不是抽象的,而是合法的Java。

接口和抽象类之间的另一个区别是,一个类可以从多个接口继承,但只能从一个抽象类继承。

abstract public class AbstractClassA { }
abstract public class AbstractClassB { }
public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }

上面的代码生成一个编译器错误,不是因为这些类都是空的,而是因为InheritsFromTwoAbstractClasses它试图从两个抽象类继承,这是非法的。以下内容完全合法。

interface InterfaceA { }
interface InterfaceB { }
public class InheritsFromTwoInterfaces
    implements InterfaceA, InterfaceB
{ } 

接口和抽象类之间的第一个差异是第二个差异的原因。看一下下面的代码。

interface InterfaceA
{
    void method();
}

interface InterfaceB
{
    void method();
}

public class InheritsFromTwoInterfaces
    implements InterfaceA, InterfaceB
{
    void method() { System.out.println("method()"); }
}

上面的代码没有问题,因为InterfaceA并且InterfaceB没有任何隐藏的东西。很容易看出调用method会打印“ method()”。

现在看下面的代码:

abstract public class AbstractClassA
{
    void method() { System.out.println("Hello"); }
}

abstract public class AbstractClassB
{
    void method() { System.out.println("Goodbye"); }
}

public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }

这与我们的其他示例完全相同,除了因为我们被允许在抽象类中实现方法而已,并且因为我们不必在继承类中实现已经实现的方法而没有。但是你可能已经注意到,这是一个问题。我们打电话时会new InheritsFromTwoAbstractClasses().method()怎样?是否打印“ Hello”或“再见”?你可能不知道,Java编译器也不知道。另一种语言,C ++允许这种继承,并且它们以通常非常复杂的方式解决了这些问题。为了避免这种麻烦,Java决定将这种“多重继承”定为非法。

Java解决方案的缺点是无法完成以下操作:

abstract public class AbstractClassA
{
    void hi() { System.out.println("Hello"); }
}

abstract public class AbstractClassB
{
    void bye() { System.out.println("Goodbye"); }
}

public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }

AbstractClassA并且AbstractClassB是“ mixins”或不打算实例化的类,但为通过继承“混合到”这些类的功能添加了功能。弄清楚如果调用new InheritsFromTwoAbstractClasses().hi()或会发生什么,显然没有问题new InheritsFromTwoAbstractClasses().bye(),但是你不能这样做,因为Java不允许这样做。

(我知道这是一篇很长的文章,所以如果其中有任何错误,请告诉我,我将予以纠正。)



 类似资料:
  • 问题内容: 当我发现它是一个接口时,我正在阅读接口。我不太了解什么是静态接口,它与常规接口有何不同? 这是接口的定义。此处的文档: Map.Entry 。 问题答案: 我对它不是内部接口的情况感到好奇。 所述改性剂只允许在嵌套类或接口。在您的示例中,嵌套在接口内部。 对于接口,修饰符实际上是可选的。对于接口来说,这种区别是没有意义的,因为它们不包含任何仍然可以访问外部接口的代码。

  • 问题内容: 我刚刚了解了Java Collections Framework如何在链表中实现数据结构。据我了解,这是一种遍历列表等数据结构中各项的方式。为什么使用此接口?为什么是方法,而不是直接编码为数据结构实现本身? 从Java网站:链接文本 公共接口Iterator 集合上的迭代器。在Java集合框架中,迭代器代替了枚举。迭代器与枚举有以下两种不同: 迭代器允许调用者在迭代期间使用定义明确的语

  • 问题内容: 在Java中,接口的任何使用都由抽象类实现。我知道接口的一个优点是,如果我们实现一个接口,那么我们也可以扩展另一个类。Java接口还有其他用途或优点吗? 问题答案: 您喜欢什么:在一个Abstract类中成千上万个抽象方法并继承该类,或者为特定的抽象方法创建尽可能多的接口,并通过继承所需的任意数量的接口来仅使用您想要的那些方法… 因此,仅通过继承特定接口使用该方法即可,如果您要继承类,

  • 问题内容: 当在标记界面中没有什么要实现的东西时,实现它有什么用? 问题答案: 在Java的早期版本中,标记接口是声明有关类的元数据的唯一方法。例如,可序列化标记接口使类的作者可以说他们的类在进行序列化和反序列化时将表现正确。 在现代Java中,标记接口没有位置。它们可以完全由Annotations代替,从而具有非常灵活的元数据功能。如果你具有有关类的信息,并且该信息永不更改,则注释是表示它的非常

  • 标记接口是一个没有任何成员的接口。可序列化就是一个例子。 我们可以定义自己的标记界面吗。如果是,我们如何定义它的功能。?

  • 问题内容: 一位同事问我有关Java API中的类的问题。 按照标准,我确实理解,每个* able结尾的单词都是java API中的接口。有一个关于使用诸如接口名称之类的行业标准。因此,我在不知不觉中告诉他有关Java世界中所有异常和错误类型的基本接口。然后,他向我展示了此类的Java文件。 我的问题: 为什么Java人选择此名称作为类。我认为默认情况下应该是接口? 这是使用* able单词作为界