gpt4 book ai didi

java - 将属性更改为最终属性

转载 作者:行者123 更新时间:2023-12-01 18:54:03 26 4
gpt4 key购买 nike

我想将子类继承的属性初始化为final。但是,当我访问该属性时,它似乎更改,因此我想,我创建了另一个最终属性。是否可以将父类(super class)中提到的属性设置为最终属性而不创建另一个属性?

简化代码:

public abstract Superobj {
protected boolean attribute = false;
protected String condition; //A condition to be checked in a subclass
protected String[] collection; //Stores strings
protected int howmany= 0;


public Superobj(int i){
this.collection = new String[i];}

public void insert(String s){
this.collection[howmany] = s;
howmany++;
if (s == condition) {attribute = true;}}

我使用另一个类的另一个对象将参数传递给插入方法。子类中的构造函数初始化条件:

public Subclass extends Superclass{
public Sublclass(int i){
super(i);
this.condition = "cond";}}

但是,在一个子类中,我不想更改属性 - 无论向表中插入什么内容。例如,我想让它成为最终的、永远错误的。我尝试过:

public FinalSubclass extends Superclass {
protected final boolean condition = false;
...

但是,当我检查 this.attribute 的值时,它会根据传递的参数的值而变化 - 就好像创建了另一个 this.attribute 一样,与继承的属性相反。我无法向子类的构造函数添加如下内容:

final this.attribute = false;

有什么办法可以将继承的属性更改为final吗?如果传递与条件匹配的内容并且继承的方法会尝试更改属性,是否会出现异常?

最佳答案

根据Java language specification最终变量的重新分配会导致编译时错误。因此,您无法在运行时“选择”变量是否为最终

但是,您似乎不需要这样的功能。

如果我正确理解您的目的(我假设 SuperclassSuperobj 的子类型),您希望始终在插入时更改 attribute 值在 Superobj (及其子类)中,除了在 FinalSublcas 中插入。因此,您可以通过以下方式重写 FinalSublcas 中的 insert 方法:

@Override
public void insert(String s){
this.collection[howmany] = s;
howmany++;
}

如果您希望 attributeFinalSubclass 中永远不会更改(不仅仅是通过插入),您可以在 Superobj 中将该字段设为私有(private)并创建 protected setAttribute(String attribute) setter,应该在 Subclass 中以某种方式重写,如下所示:

@Override
protected setAttribute(String attribute) {
// do nothing or throw exception
}

但我不会推荐它,因为违反了里氏替换原则(从我的角度来看)

关于java - 将属性更改为最终属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59691906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com