Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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 - Fatal编程技术网

Java 为什么这个私有浮动字段变为零?

Java 为什么这个私有浮动字段变为零?,java,Java,我有一些奇怪的行为,我正努力向自己解释。称为“textureScale”的浮点字段变为零 如果某些代码正在更改值,则可以解释这一点。然而,我希望通过将其设置为“私有最终浮点”,能够导致构建失败,或者至少是运行时异常,那么无论改变值的是什么,都将失败。但是如果我这样做,代码就不会失败——它工作得很好 有谁能帮我理解这里可能发生的事情吗?为什么这个浮动会变成零,除非我把它设为最终值?这里有我不熟悉的Java ism吗?唯一的解释是否在其他地方的代码中有些模糊 public class Texture

我有一些奇怪的行为,我正努力向自己解释。称为“textureScale”的浮点字段变为零

如果某些代码正在更改值,则可以解释这一点。然而,我希望通过将其设置为“私有最终浮点”,能够导致构建失败,或者至少是运行时异常,那么无论改变值的是什么,都将失败。但是如果我这样做,代码就不会失败——它工作得很好

有谁能帮我理解这里可能发生的事情吗?为什么这个浮动会变成零,除非我把它设为最终值?这里有我不熟悉的Java ism吗?唯一的解释是否在其他地方的代码中有些模糊

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?!
    }
}

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


如果将字段声明为final,编译器可能会使用常量表达式替换字段访问,这将使其工作

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


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

您能在一个简短但完整的程序中重现它吗?java本机方法是否可以像C一样工作,在通过引用传递时可以更改值?看起来像一个图形库,有很多本地代码。你发布的代码中没有任何东西让我相信
textureScale
正在变成
0
。Hi Jon,我承认我应该先做这件事-我想我期待有人说“啊,那是因为在Java中,你必须手动初始化浮点…”或类似的话。我将看看是否可以在完整的程序中重现:)在方法中设置断点。它是从超级构造函数调用的吗?如果是,则该字段在该点未初始化。如果您将字段声明为final,编译器可能会使用常量表达式替换字段访问,这将使其正常工作。是的,受保护的方法在超级构造函数中调用。这就是问题所在-谢谢你的回答!你说得对:)谢谢你花时间回答——尽管阿里安先到了那里!非常感谢!