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

在Java中,为什么不能在父类中声明最终成员(不进行初始化),并在子类中设置其值?我该如何解决?

夹谷俊远
2023-03-14
问题内容

在Java程序中,我有多个从父类(抽象的)继承的子类。我想表达的是,每个孩子都应该有一个仅设置一次的成员(我打算从构造函数中进行设置)。我的计划是编写代码。像这样:

public abstract class Parent {
    protected final String birthmark;
}

public class Child extends Parent {
    public Child(String s) {
        this.birthmark = s;
    }
}

但是,这似乎并不能取悦Java之神。在父类中,我收到消息birthmark“可能尚未初始化”,在子类中,我得到“
birthmark无法访问最终字段”。

那么Java的处理方式是什么?我想念什么?


问题答案:

您无法执行此操作,因为在比较父类时,编译器无法确定子类会对其进行初始化。您必须在父级的构造函数中对其进行初始化,然后让子级调用父级的构造函数:

public abstract class Parent {
    protected final String birthmark;
    protected Parent(String s) {
        birthmark = s;
    }
}

public class Child extends Parent {
    public Child(String s) {
        super(s);
        ...
    }
}


 类似资料:
  • 问题内容: 为什么不能在Java中将类声明为静态类? 问题答案: 只有嵌套的类可以是静态的。这样,你可以使用嵌套类而无需外部类的实例。

  • 问题内容: 给定以下类别: 我的目标不是像“因为在JLS中这样指定”这样的答案。我知道是的,因为JLS是12.4.1发生初始化时,其读取内容仅为: 类或接口类型T将在以下任何一种首次出现之前立即初始化: … T是一个类,并调用T声明的静态方法。 … 我对没有这样的句子是否有充分的理由感兴趣: T是S的子类,并且在T上调用S声明的静态方法。 问题答案: 我认为这与jvm规范的这一部分有关: 每个框架

  • 当我在java中在方法之外的单独行上声明和构造一个数组时,我感到困惑,因此它将是一个实例变量,我得到一个编译错误,然而当我在一行上构造和初始化时,它是好的,为什么会发生这种情况? }

  • 问题内容: Java教程说,由于内部类与封闭类的实例相关联,所以它(内部类)本身不能定义任何静态成员。 对我来说很有趣,为什么内部类不能声明静态成员,例如某个字段,该内部类的实例可能会与同一内部类的其他实例共享这些成员?这仅仅是Java中必须被视为理所当然的事情的实现吗? 问题答案: 基本上只是一个任意决定。我们没有理由也 不可能 得到支持,但还算不上什么好的理由 来 支持它。只需在外部类中声明静

  • 给定以下类: 我不是针对“因为JLS中规定了这样的问题”这样的答案。我知道是这样的,因为JLS 12.4.1在初始化时只读取: 类或接口类型T将在第一次出现以下任一情况之前立即初始化: > T是一个类,调用由T声明的静态方法。 ... 我感兴趣的是,为什么没有这样一句话,是否有一个很好的理由: T是S的子类,在T上调用由S声明的静态方法

  • 问题内容: 如何在Java中声明和初始化数组? 问题答案: 你可以使用数组声明或数组文字(但只有当你立即声明并影响变量时,数组文字才能用于重新分配数组)。 对于原始类型: 例如,对于类,String是相同的: 当你首先声明数组然后对其进行初始化时,第三种初始化方法很有用。