gpt4 book ai didi

java - 为什么这个私有(private) float 字段会变成零?

转载 作者:搜寻专家 更新时间:2023-11-01 01:08:09 27 4
gpt4 key购买 nike

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

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

任何人都可以帮助我理解这里可能发生的事情 - 为什么这个 float 会变成零,除非我将它设置为最终值?这里有我不熟悉的 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?!
}
}

最佳答案

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

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

关于java - 为什么这个私有(private) float 字段会变成零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19257371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com