当前位置: 首页 > 面试题库 >

在System.out.println()中

金昌胤
2023-03-14
问题内容

首先感到遗憾的是,如果这是一个非常基本的问题,我建议我仍然是代码猴子。我在一次采访中被要求阐明System.out.println(); 我解释了以下方式

//this class belongs to java.lang package
class System{
  public static PrintStream out;
}
//this class belongs to java.io package
class PrintStream{
 public void println..
}

我已经解释说System.out是有效的,因为这是我们在Java中访问静态变量的方式,而out是PrintStream的对象,因此我们可以访问其方法。

System.out.pritnln();

他要求我模拟一个类似的程序,我跟踪了它,但是它没有用,因为System.out返回null

我的问题是在java中实例化的对象在哪里?如果我没看错,它是预定义的对象吗?为此应该进行细致的解释。

从技术上讲,我们应该喊什么?是类型为PrintStream的变量还是应该说它为类型为PrintStream的对象?


问题答案:

System.out初始化null为实例化该类时。这由中的nullPrintStream()方法设置,该方法System.java仅会返回null

JVM初始化后,将调用该initializeSystemClass()方法。此方法调用native方法setOut0()这设定out变量为适当的值。

这看起来很奇怪,但是由于以下原因,它是必需的操作:

  • out不能静态设置为该值,因为System它必须是第一个加载的类之一(之前PrintStream)。
  • out必须为,final以便其值不能被用户直接覆盖。
  • 由于out不能静态设置并且是最终的,因此我们必须使用native方法重写语言的语义setOut0()

希望对您有所帮助。



 类似资料:
  • 问题内容: 和之间的技术区别到底是什么?我知道这会写入标准输出,但这与控制台不同吗? 我不完全理解的文档进行。 问题答案: 以下是使用/ / 和之间的主要区别: 如果您的应用程序未在终端中运行,则返回null(尽管您可以在应用程序中处理此问题) 提供读取密码而不回显字符的方法 并使用默认平台编码,而类输出方法使用控制台编码 后一种行为可能不会立即显而易见,但是像这样的代码可以证明区别: 在我的Wi

  • 编辑:许多人对这个问题感到困惑。上限的使用只是为了创建这个示例。我知道这是不正确的。问题是,如果反编译上面的代码,您将看到编译器将t.getTheString(implclass.class)结果类型转换为String,因为它可能不确定类型。我的问题是,如果它是典型的反对会不会更好。在这种情况下,它将调用toString()方法,代码将正常工作。这是Java编译器的问题还是我在这里遗漏了什么?

  • 问题内容: 以下代码中有错误吗?它显示找不到符号,符号:类出位置:类系统。在日志中,它显示了很多错误,包括 java.lang.ClassFormatError:类Area中的方法“”具有非法签名“(Ljava / lang / Object;)Ljava / lang / System $ out $ println;” 问题答案: 该语句应写在某些块中。不能直接在课堂上写。 它应该放在大括号内

  • 问题内容: 我的应用程序有许多System.out.println()语句。 我想从println捕获消息并将其发送到标准记录器(Log4j,JUL等)。 怎么做 ? 问题答案: System类具有,可以用于将输出流更改为例如具有支持的新File流,在这种情况下,可能是另一个使用你选择的日志记录子系统的流。 请记住,如果你将日志记录库配置为输出到标准输出或错误(可能是无限递归类型),则很可能会遇到

  • 问题内容: 假设我要打印5行。哪种方法最好(提高性能和可读性)。 要么 是偏好问题还是一个优于另一个问题。使用第二种方法似乎可以节省很多时间。 问题答案: 有一个 功能性 两者之间的区别。第一个版本使用平台的首选行分隔符输出换行符。第二个版本输出换行符,这在Windows或Mac OS上可能是不合适的。 这比任何实际或想象的性能优势都重要。 关于性能,以及为什么每个人似乎都说“已经足够”了。 两种

  • 问题内容: 我有一个多线程Java应用程序,该应用程序会将有关它收到的消息的信息输出到控制台以进行调试。每次应用程序收到消息时,它将在消息上调用。 我遇到的问题是,如果应用程序被消息淹没,则会打印错误信息(例如旧缓冲区信息)。这使我想知道是否存在线程问题,即多个线程一次调用该函数,而没有正确刷新缓冲区。 在我的主程序(线程)中,我有以下效果: 在我的线程中,我有以下效果: 是否有一种简单的方法可以