我有两个扩展相同抽象类的类。 它们都需要相同的常数,但具有不同的值。 我怎样才能做到这一点? 一些示例代码显示了我想要做的事情。

abstract class A {
   public static int CONST;
}

public class B extends A {
   public static int CONST = 1;
}

public class C extends A {
   public static int CONST = 2;
}

public static void main(String[] args){
    A a = new B();
    System.out.println(a.CONST); // should print 1
}

上面的代码没有编译,因为CONST没有在类A中初始化。我怎样才能使它工作? 对于B的所有实例,CONST的值应为1,对于所有C的实例,CONST的值应为2,对于所有A的实例,CONST的值应为1或2.对于此,是否有任何方法可以使用静态?

===============>>#1 票数:23 已采纳

你不能这样做。

但是,你可以这样做:

abstract class A {
   public abstract int getConst();
}

public class B extends A {
   @Override
   public int getConst() { return 1; }
}

public class C extends A {
   @Override
   public int getConst() { return 2; }
}

public static void main(String[] args){
    A a = new B();
    System.out.println(a.getConst());
}

===============>>#2 票数:6

如果常量具有变量值,则它不再是常数。 静态字段和方法不是多态的。 您需要使用公共方法来执行您想要的操作。

  ask by Fractaly translate from so

未解决问题?本站智能推荐:

2回复

覆盖类常量与属性

我想更好地理解为什么在下面的场景中,类常量被继承的方式与实例变量的方式不同。 输出: 在上面的代码中,ChildClass没有showTest()方法,因此继承使用ParentClass showTest()方法。 结果显示,由于该方法在ParentClass上执行,因此正在评
5回复

强制子类在抽象java类中包含常量

我有一个抽象类,我希望所有子类根据实现定义一个常量 - 它主要是关于类实现的元数据。 在超类中: 然后在子类中: 有没有办法强制类的实现声明一个常量?
3回复

Java中的静态和覆盖

输出: 1 40 为什么会这样? 请解释。
2回复

覆盖Java中的构造函数

在学校里,我需要学习Java,并且由于我习惯于基于C ++(例如Cocoa / Objective-C)的语言,所以我对Java感到非常沮丧。 我做了一个超类(也可以用作基类): 现在,当我这样称呼它时: 我得到这个: CellView_constructor
2回复

Java继承:子类中的方法将覆盖超类中的方法

这是背景:有2类: Person与Student extends Person class Person有1种方法: print(Person x) {System.out.println("Person")} (1) 班级学生有两种方法: print(Student x) {System.
3回复

如何在Java中覆盖父构造函数?

我目前有一个类,我们将其称为Person,它具有类似的构造函数。 然后,我们以更特定的Person类型(在本例中为Employee)继承该类。 我想使它在创建对象时让Employee打印它自己的语句,但是相反,它既打印Person的打印语句,也打印Employee的打印语句。
4回复

覆盖Java中的equals(...)方法时出现问题

这个问题已经在这里有了答案: 在Java中重载等于时,为什么使用Object以外的其他参数不起作用? 7个答案 我有一个超类Order ,它有一个子类OrderBook 。 equals(...)方法在OrderBook被覆盖。 该方法的实现如下: 如
17回复

有没有一种方法可以覆盖Java中的类变量?

函数doIt将打印“ dad”。 有没有办法让它打印“儿子”?
2回复

无法理解java中的继承和覆盖/重载

我有问题理解下面的代码(对行号进行了评论)
2回复

我可以覆盖使用子类对象作为Java中的参数吗?

我的课程如下 我试图覆盖基类方法,但我正在更改派生类中的参数。 在方法MoreUseful.f()中我使用子类参数(String)作为基类中的Object。 在方法MoreUseful.g()我使用超类参数(Object)作为基类中的String。 是否可以覆盖这些方式? 以