0

我在一个无法为 Console 类创建新实例的地方感到震惊。所以我拿了jdk的源代码然后研究它。然后我被清除它被声明为“公共最终类控制台............”......所以我明白最终类不能被实例化。但这不是我真正的怀疑。在 SCJP 书中,我遇到了一行代码,告诉我Console c = System.console()

这里我们不能为控制台类创建新实例,所以创建一个引用变量 c。那么 System.console 实际上是什么?在书中它被称为

    Keep in mind that it's possible for your Java program to be running in an environment that doesn't have access to a console object, so be sure that your invocation of System.console() actually returns a valid console reference and not null.

然后我进入查找 System.console() 的源代码。

在那里,我碰巧看到 System 是最终类,而 console() 是其中的静态方法。

那么控制台引用对象如何引用系统类中的那个控制台方法。这两者之间的联系是什么。我想到了一个多态引用。但这并不是因为它没有通过 IS-A 测试。所以请详细解释一下。

希望我的问题很清楚。提前致谢。!

4

2 回答 2

3

最终类无法实例化

那是错误的,final类不能被子类化。new如果其构造函数是可见的,则可以使用运算符对其进行实例化。我猜Console类有private构造函数。抽象类不能被实例化。请参阅JLS 8.1.1.2

如果一个类的定义是完整的并且不需要或不需要子类,则可以将其声明为最终类。

如果最终类的名称出现在另一个类声明的扩展子句(第 8.1.4 节)中,则是编译时错误;这意味着最终类不能有任何子类。

System.console()

返回与当前 Java 虚拟机关联的唯一 Console 对象(如果有)。

虚拟机是否具有控制台取决于底层平台以及调用虚拟机的方式。如果虚拟机从交互式命令行启动而不重定向标准输入和输出流,那么它的控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常不会有控制台。

如果这个虚拟机有一个控制台,那么它由这个类的一个唯一实例表示,可以通过调用 System.console() 方法获得

如果没有可用的控制台设备,则调用该方法将返回 null。

console()是某种工厂方法,它为您返回Console与当前 JVM 关联的对象。该类System了解它在其中运行的 JVM,并且它是返回Console对象的理想人选。

Console c = System.console();

System.console()给我们一个对Console对象的引用,并且您将对象引用分配给 variable c。这样您就可以使用该引用变量c来访问Console对象的属性或方法。

于 2013-07-04T07:26:44.250 回答
1

我相信你理解的错误就在这里:

所以我明白最终类无法实例化

最终类不能扩展,但可以实例化。仅供参考,它是无法实例化的抽象类。

于 2013-07-04T07:33:13.667 回答