Java 从实例获取静态字段
我有一个包含多个子类的类:Java 从实例获取静态字段,java,inheritance,static,Java,Inheritance,Static,我有一个包含多个子类的类: class A { static int i = 5; } class B extends A{ static int i = 6; } class C extends A { static int i = 7; } 我正在尝试编写一个比较器,它接受两个a,并根据它们的I值对它们进行比较。我被困在: public int compare(A a1, A a2) { } 既不是a1.i也不是a1.class.getField(“i
class A {
static int i = 5;
}
class B extends A{
static int i = 6;
}
class C extends A {
static int i = 7;
}
我正在尝试编写一个比较器,它接受两个a
,并根据它们的I
值对它们进行比较。我被困在:
public int compare(A a1, A a2) {
}
既不是a1.i
也不是a1.class.getField(“i”).getInt(null)代码>工作
如何从对象获取静态场的值
a1.i
因为a1被声明为a
,所以它相当于a.i
。编译器应该告诉您这一点,并给出警告。大多数IDE都会这样做,并给出一个关于如何处理它的小消息
a1.class.getField("i").getInt(null);
无法工作,因为类
是静态的
你可以用
a1.getClass().getDeclaredField("i").getInt(null);
getClass
是获取对象类的实例方法getDeclaredField
将返回所有字段,而getField
将只返回公共字段。成员变量在Java中不是多态的(无论是静态的还是非静态的)。你所能做的最好的就是使用反射,但是可能有更好的方法来实现这里的总体目标。它们不是多态的?不,只有非静态方法是。不,它们不是。你必须改变你的设计。用getI()方法定义一个接口HasI,让a、B和C实现HasI怎么样?您的比较将在comapre(HasI a,HasI b)中公开。编译器应该抱怨该编译器不会抱怨它,它将显示一个警告,遗憾的是,我们程序员往往忽略警告,因为我们只关心错误:)通过抱怨我的意思是显示警告。我将进行编辑以使其更明确。编译器错误通常被称为编译器错误。