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

为什么不抽象字段?

孟成化
2023-03-14
问题内容

为什么Java类不能像抽象类那样具有抽象字段?

例如:我有两个扩展相同抽象基类的类。这两个类各自具有相同的方法,但其中包含String常数(恰好是错误消息)。如果字段可以是抽象的,那么我可以使这个常量抽象,并将该方法引入基类。相反,我必须创建一个抽象方法,getErrMsg()在这种情况下称为该方法,该方法返回String,在两个派生类中重写此方法,然后可以拉出该方法(现在称为抽象方法)。

为什么我不能仅将字段抽象化?Java是否可以设计成允许这样做?


问题答案:

您可以通过在抽象类中的final字段中初始化其构造函数(未经测试的代码)来完成您描述的操作:

abstract class Base {

    final String errMsg;

    Base(String msg) {
        errMsg = msg;
    }

    abstract String doSomething();
}

class Sub extends Base {

    Sub() {
        super("Sub message");
    }

    String doSomething() {

        return errMsg + " from something";
    }
}

如果您的子类“忘记”通过超级构造函数初始化最后一个,则编译器将发出 警告 错误,就像未实现抽象方法时一样。



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

  • 问题内容: 对于许多人来说,这可能是一个简单的问题,但令我感到困惑。我从Kathy Sierra挑选了一个示例,该示例显示了抽象类的效用,但我无法理解抽象类的总体重要性。 示例 我们有一个带有抽象方法- &的抽象类。这些方法在 BMW , Volkswagen 和 Audi的 子类中实现。 我的问题是- 为什么我们首先需要有抽象类来为每种汽车类型自定义方法?为什么在宝马的任何一种子类型中都没有这两

  • 问题内容: 我很难理解为什么一个类中的动作是抽象的而另一个类中的动作却不是抽象的。 源代码1:(编译时出错:https : //gyazo.com/cd3c21a8562589451814903febaf89fe) 源代码2 :(编译好的代码) 问题答案: 因为在第一个示例中您输入错误: 应该是

  • 问题内容: 为什么将类实现为常规类而不是将 抽象方法实现为 抽象 类。 会不会带来任何问题?或以这种方式有什么用吗? 而且,该方法应该是一种非常特定的方法, 其功能不能由任何其他类实现 (如果我没记错的话)。因此,我想该关键字比其他任何方法都更适合此操作。 但是我可以重写此方法并根据需要使用它, 它显然只印了, 有人告诉你我会产生一个新线程吗? 除了使工程师取代您感到困惑之外,还有什么其他用途?

  • 问题内容: 将接口声明为抽象有什么意义?接口方法也是如此。有什么意义吗? 例如。 问题答案: 您在哪里遇到过已发布的代码块,任何旧的Java代码库? 这就是 JLS不得不说: 9.1.1.1抽象接口: 每个接口都是隐式抽象的。该修饰符已过时,不应在新程序中使用。 9.4抽象方法声明: 为了与Java平台的较早版本兼容,出于风格考虑,允许但不鼓励为接口中声明的方法冗余地指定abstract修饰符。

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