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

什么是Java中的“抽象类”?

壤驷穆冉
2023-03-14
问题内容

什么是Java中的“抽象类”?


问题答案:

抽象类是无法实例化的类。通过创建可以实例化的继承子类来使用抽象类。抽象类为继承的子类做一些事情:

  1. 定义继承子类可以使用的方法。
  2. 定义继承子类必须实现的抽象方法。
  3. 提供一个公共接口,该接口允许子类与所有其他子类互换。

这是一个例子:

abstract public class AbstractClass
{
    abstract public void abstractMethod();
    public void implementedMethod() { System.out.print("implementedMethod()"); }
    final public void finalMethod() { System.out.print("finalMethod()"); }
}

请注意,“ abstractMethod()”没有任何方法主体。因此,你不能执行以下操作:

public class ImplementingClass extends AbstractClass
{
    // ERROR!
}

没有实现的方法abstractMethod()!因此,当JVM收到类似的信息时,它就无法知道应该做什么new ImplementingClass().abstractMethod()

这是正确的ImplementingClass

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
}

请注意,你不必定义implementedMethod()或finalMethod()。它们已经由定义AbstractClass

这是另一个正确的说法ImplementingClass

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

在这种情况下,你已覆盖implementedMethod()

但是,由于存在final关键字,因此无法执行以下操作。

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
    public void finalMethod() { System.out.print("ERROR!"); }
}

你不能这样做,因为finalMethod()in的实现AbstractClass被标记为的最终实现finalMethod():永远不允许其他实现。

现在,你还可以实现两次抽象类:

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

// In a separate file.
public class SecondImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("second abstractMethod()"); }
}

现在,你可以在其他地方编写另一种方法。

public tryItOut()
{
    ImplementingClass a = new ImplementingClass();
    AbstractClass b = new ImplementingClass();

    a.abstractMethod();    // prints "abstractMethod()"
    a.implementedMethod(); // prints "Overridden!"     <-- same
    a.finalMethod();       // prints "finalMethod()"

    b.abstractMethod();    // prints "abstractMethod()"
    b.implementedMethod(); // prints "Overridden!"     <-- same
    b.finalMethod();       // prints "finalMethod()"

    SecondImplementingClass c = new SecondImplementingClass();
    AbstractClass d = new SecondImplementingClass();

    c.abstractMethod();    // prints "second abstractMethod()"
    c.implementedMethod(); // prints "implementedMethod()"
    c.finalMethod();       // prints "finalMethod()"

    d.abstractMethod();    // prints "second abstractMethod()"
    d.implementedMethod(); // prints "implementedMethod()"
    d.finalMethod();       // prints "finalMethod()"
}

请注意,即使我们声明bAbstractClass类型,它也会显示"Overriden!"。这是因为我们实例化的对象实际上是一个ImplementingClass,它implementedMethod()当然会被覆盖。(你可能已经将其称为多态。)

如果我们希望访问特定于特定子类的成员,则必须首先将其转换为该子类:

// Say ImplementingClass also contains uniqueMethod()
// To access it, we use a cast to tell the runtime which type the object is
AbstractClass b = new ImplementingClass();
((ImplementingClass)b).uniqueMethod();

最后,你不能执行以下操作:

public class ImplementingClass extends AbstractClass, SomeOtherAbstractClass
{
    ... // implementation
}

一次只能扩展一个类。如果需要扩展多个类,则它们必须是接口。你可以这样做:

public class ImplementingClass extends AbstractClass implements InterfaceA, InterfaceB
{
    ... // implementation
}

这是一个示例界面:

interface InterfaceA
{
    void interfaceMethod();
}

这基本上与以下内容相同:

abstract public class InterfaceA
{
    abstract public void interfaceMethod();
}

唯一的区别是第二种方法不让编译器知道它实际上是一个接口。如果你希望人们仅实现你的界面而没有其他人,则这将很有用。但是,作为一般初学者的经验法则,如果抽象类仅具有抽象方法,则可能应将其设为接口。

以下是非法的:

interface InterfaceB
{
    void interfaceMethod() { System.out.print("ERROR!"); }
}

你不能在接口中实现方法。这意味着,如果你实现两个不同的接口,则这些接口中的不同方法不会冲突。由于接口中的所有方法都是抽象的,因此你必须实现该方法,并且由于你的方法是继承树中的唯一实现,因此编译器知道它必须使用你的方法。



 类似资料:
  • 问题内容: 我对 抽象类 及其使用有一些疑问。我了解有关它们的基础知识;例如,它们不能被实例化,它们可以具有具体和抽象的方法,…但是我想我想知道的是, 它们在生命中(在软件工程中)起什么作用? Java中抽象类的目的是什么?为什么和何时应该使用Abstract类?如果可以使用普通的类然后继承它,为什么还要继承一个抽象类?使用抽象类如何使我们的生活更轻松?它会提供更好的可维护性吗?更灵活?… 顺便说

  • 问题内容: 什么是PHP中的抽象类? 如何使用? 问题答案: 抽象类是至少包含一个抽象方法的类,该方法中没有任何实际代码,只是名称和参数,并且已标记为“抽象”。 这样做的目的是提供一种模板,以从其继承并强制继承类实现抽象方法。 因此,抽象类介于常规类和纯接口之间。接口也是抽象类的特殊情况,其中所有方法都是抽象的。 有关更多参考,请参见PHP手册的这一部分。

  • 问题内容: 我得到了几种解释,但是到目前为止,我还无法理解Java中的抽象类和方法是什么。 有人说它必须与程序的安全性做些关系,另一些人说不是那样。 即使从Dietel&Dietel的书中,我也不明白它的目的。我们何时,何地,为什么使用它? 请像您正在教初学者一样进行解释,非常感谢您的帮助。 问题答案: 抽象类是无法实例化的类。唯一的目的是扩展其他类。 抽象方法是抽象类中的方法(必须声明为抽象),

  • 问题内容: 为什么Object类是Java中em的基类,而不是抽象类? 我已经有很长时间了,这个问题纯粹是出于好奇,仅此而已。我的代码或任何人的代码都没有中断,因为它不是抽象的,但是我想知道为什么他们将其具体化了? 为什么有人要这个Object类的“实例”(而不是引用的存在)?一种情况是糟糕的同步代码,该代码使用对象的实例进行锁定(至少我曾经以这种方式使用过一次……我的错)。 对象类的“实例”是否

  •   抽象用于向用户隐藏函数的内部功能。他们可以与函数交互并生成结果,但不知道结果是如何生成的。   简单来说,抽象就是用来对用户隐藏不相关的数据,以降低程序的复杂度。 在 Python 中借助 ABC 模块,我们可以实现抽象。   抽象类也可以作为其他类的基石,因为你不能为抽象类创建对象,所以访问元素的唯一方法是使用继承。

  • 本文向大家介绍什么是虚函数?什么是抽象函数?相关面试题,主要包含被问及什么是虚函数?什么是抽象函数?时的应答技巧和注意事项,需要的朋友参考一下 答: 虚函数:没有实现的,可由子类继承并重写的函数。Virtual CallSomeOne(); 抽象函数:规定其非虚子类必须实现的函数,必须被重写。public abstract void CallSomeOne();