Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从实例获取静态字段_Java_Inheritance_Static - Fatal编程技术网

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)中公开。编译器应该抱怨该编译器不会抱怨它,它将显示一个警告,遗憾的是,我们程序员往往忽略警告,因为我们只关心错误:)通过
抱怨
我的意思是
显示警告
。我将进行编辑以使其更明确。编译器错误通常被称为编译器错误。