【问题标题】:Is there a way to declare a final attribute in an abstract super class and initialize the value in the sub class?有没有办法在抽象超类中声明最终属性并在子类中初始化值?
【发布时间】:2022-01-18 11:25:20
【问题描述】:

我想要一个带有最终属性locationNumber 的抽象超类Location。 但是locationNumber 应该在子类本身中初始化,如Market 或Mosque。有干净的方法吗?我知道它不会像这样工作,它只是为了显示问题。

public abstract class Location {
    protected final int locationNumber;
    Collection<Figure> visitors;

    public int getLocationNumber() {
        return locationNumber;
    }
}

public class Market extends Location {
    locationNumber = 5;
}

public class Mosque extends Location {
    locationNumber = 10;
}

【问题讨论】:

  • 是的。您可以在“构造函数”中初始化最终值。如果您至少声明了一个显式构造函数,那么子类可以(并且实际上需要)使用它。
  • 哇,这很简单,没想到。谢谢!
  • 你有同事在做同样的任务吗? stackoverflow.com/questions/70754039/… ...也许你们两个应该合作并一起工作。你知道,那个学生首先要弄清楚你是否能自己解决问题……

标签: java subclass final superclass


【解决方案1】:

你会这样做:

public abstract class Location {

    private final int locationNumber;
    Collection<Figure> visitors;

    public Location(int locationNumber) {
       this.locationNumber = locationNumber;
    }

    public int getLocationNumber() {
        return locationNumber;
    }
}

public class Market1 extends Location {

    public Market1() {
       super(5);
    }
}

public class Market2 extends Location {

    public Market2() {
       super(10);
    }
}

Location m1 = new Market1();
Location m2 = new Market2();

System.out.println(m1.getLocationNumber()); // prints 5
System.out.println(m2.getLocationNumber()); // prints 10

【讨论】:

    【解决方案2】:

    final 类成员变量在声明时不需要初始化。它可以在类构造函数或初始化块中赋值。

    public abstract class Location {
    
        protected final int locationNumber;
        Collection<Figure> visitors;
    
        protected Location(int locNum) {
            locationNumber = locNum;
        }
    
        public int getLocationNumber() {
            return locationNumber;
        }
    }
    

    public class Market extends Location {
        public Market() {
            super(5);
        }
    }
    

    或者,您可以将方法 getLocationNumber 抽象化并让每个子类返回相关值。那么你就不需要成员locationNumber。

    public abstract class Location {
        Collection<Figure> visitors;
    
        public abstract int getLocationNumber();
    }
    

    public class Market extends Location {
    
        public int getLocationNumber() {
            return 5;
        }
    }
    

    但如果您仍想保留成员locationNumber,那么以下方法也可以。

    public abstract class Location {
        protected final int locationNumber;
    
        protected Location() {
            locationNumber = getLocationNumber();
        }
    
        public abstract int getLocationNumber();
    }
    

    public class Market extends Location {
    
        public int getLocationNumber() {
            return 5;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多