为什么这个私人浮动区变为零?

led*_*neb 4 java

我有一些奇怪的行为,我正在努力向自己解释.名为"textureScale"的浮点字段变为零.

如果某些代码改变了价值,可以解释这一点.然而,我希望能够通过将其设置为"私有最终浮动"来导致构建失败,或者至少是运行时异常 - 然后无论改变什么值都将失败.但是,如果我这样做,代码根本不会失败 - 它的效果很好!

任何人都可以帮助我理解这里有什么可能 - 为什么这个浮点数变为零,除非我把它设置为最终?这里有一个我不熟悉的Java主义吗?其他地方的代码中唯一的解释是什么?

public class TexturedBox extends Box {
    // This field becomes 0.0?
    private float textureScale = 1.0f;

    public TexturedBox(Vector3f center, float x, float y, float z) {
        super(center, x, y, z);
    }

    @Override
    protected void duUpdateGeometryTextures() {
        FloatBuffer buf = BufferUtils.createFloatBuffer(24);

        buf.clear();

        // All the values in these puts are "zero" - since textureScale is now zero?
        buf.put(textureScale * 2f * xExtent); buf.put(0);
        buf.put(0); buf.put(0);
        buf.put(0); buf.put(textureScale * 2f * yExtent);
        buf.put(textureScale * 2f * xExtent); buf.put(textureScale * 2f * yExtent);
        // ... and more puts just like that ...

        buf.flip();

        setBuffer(Type.TexCoord, 2, buf);

        System.out.println(textureScale);
        // ^ This outputs zero
        // ... unless I set textureScale to final - then everything works?!
    }
}
Run Code Online (Sandbox Code Playgroud)

Cep*_*pod 10

在方法中设置断点.它是从超级构造函数调用的吗?如果是,则该字段在该点未初始化,因为在子类的字段初始化之前调用超构造函数.

如果声明字段final,则编译器可以使用常量表达式替换字段访问,这将使其起作用


Pet*_*rey 5

我期望duUpdateGeometryTextures()从你的超类构造函数中调用它.执行此操作时,您将在构造函数完成之前访问子类,并且不会设置所有字段.

在您的情况下,调用super 之后设置非final字段.最终字段实际上是静态字段并首先进行初始化.