为什么即使没有步骤过滤器,在 Eclipse 中使用 "step into" 时也不显示对构造函数的调用

Why is call to constructor not displayed when using "step into" in eclipse even without step filter

我想了解 Math.random() 如何生成随机数。因此,我使用了 eclipse 调试器和功能 "step into"。

当我在

设置断点时
        double mathRandom = Math.random();

并使用 "step into" 这将我带入 Math.class 代码:

public static double random() {
    return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}

所以调用 random() 会调用数学 class 中的 class RandomNumberGeneratorHolder 中的构造函数 randomNumberGenerator。

构造函数randomNumberGenerator也在Mathclass行

private static final class RandomNumberGeneratorHolder {
    static final Random randomNumberGenerator = new Random();
}

但是当我在行

中使用 "step into" 时
public static double random() {
    return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}

为什么这不带我到构造函数

private static final class RandomNumberGeneratorHolder {
    static final Random randomNumberGenerator = new Random();
}

而是带我进入随机class行

public double nextDouble() {
    return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT;
}

我已 "Use step filters" 禁用。那么eclipse跳过构造函数调用的原因是什么

static final Random randomNumberGenerator = new Random()

使用 Math.random() 调用静态方法。静态方法不依赖于 class.

的实例

非静态调用将是:

Math math=new Math();
double m = math.random();

但这并不能编译,因为 Math 的默认构造函数是私有的。

你写的是"So calling random() calls constructor randomNumberGenerator in the class",这不是真的。没有 "new" 关键字,因此没有构造函数调用。

RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();

这里"randomNumberGenerator"是RandomNumberGeneratorHolderclass的静态属性(变量)。静态访问不依赖于调用构造函数。

Java classes 可以选择包含一个无名的静态初始化程序,当 class 被加载到内存中时,它由 Java VM 执行。静态初始化器可以初始化class的静态属性。这样的初始化程序显然确实用 class 的实例填充了静态 "randomNumberGenerator" 属性。因此,您可以调用其非静态 nextDouble() 方法。

其他众所周知的例子是 System.outSystem.in

我给你两个如何编写这样一个静态初始化器的例子:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Main
{
    static List<String> names;    
    static List<String> colors= Arrays.asList("red","green");

    static // notice that this method has no name!
    {
        names=new ArrayList<String>();
        names.add("CuriousIndeed");
        names.add("Stefan");
    }

    public static void main(String[] args)
    {
        System.out.println(names);
        System.out.println(colors);
    }
}

输出:

[CuriousIndeed, Stefan]
[red, green]

名称和颜色都已静态初始化,但采用两种不同的方式。