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

标签 java eclipse debugging constructor breakpoints

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

当我设置断点时

        double mathRandom = Math.random();

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

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

因此,调用 random() 会调用 Math 类中的 RandomNumberGeneratorHolder 类中的构造函数 randomNumberGenerator。

构造函数randomNumberGenerator也在Math类中一行

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();
}

而是将我带入 Random 类中

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

我禁用了“使用步骤过滤器”。那么eclipse跳过构造函数的调用是什么原因

static final Random randomNumberGenerator = new Random()

最佳答案

使用Math.random()您可以调用静态方法。静态方法不依赖于类的实例。

非静态调用是:

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

但这无法编译,因为 Math 的默认构造函数是私有(private)的。

您写道“因此调用 random() 会调用类中的构造函数 randomNumberGenerator”,这是不正确的。没有“new”关键字,因此没有构造函数调用。

RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();

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

Java 类可以选择包含一个无名静态初始化程序,当该类加载到内存中时,该初始化程序由 Java VM 执行。静态初始化器可以初始化类的静态属性。这样的初始化程序显然用类的实例填充了静态“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]

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

关于java - 为什么在 Eclipse 中使用 "step into"时,即使没有步骤过滤器,也不显示对构造函数的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248017/

相关文章:

java - Java RMI 有什么意义?

ios - 指针数据未存储在本地数据库中解析 ios

Android Maps API2 发布 key 在本地工作但不能通过 Play 商店工作

java - 最近更改后的 web.xml 值非法

java - Android - 通过 USB 连接多个设备

c++ - 如何调试挂起(死锁)的 C++ 多线程应用程序?

java - 在java小程序中打印和保存文件

java - 如何使用 REST API - Java 从 SharePoint 2010 获取更新的数据?

java - 在java中创建Hashtable作为final

eclipse - 将项目推送到远程 TFS 服务器时出现身份验证不支持错误