有没有一种方法可以在抽象超类中声明final属性并初始化子类中的值



我想要一个具有最终属性locationNumber的抽象超类Location。但是locationNumber应该像MarketMosque一样在子类本身中初始化。有干净的方法吗?我知道这样不会奏效,这只是为了说明问题。

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;
}

这就是你应该做的:

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

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

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;
}
}

最新更新