Console引用变量如何引用其他一些类方法

时间:2013-07-04 07:23:48

标签: java object console

我被困在一个无法为Console类创建新实例的地方。所以我拿了jdk的源代码然后查看它。然后我清除它被宣布为“公共最终类控制台........”......所以我明白最终的类不能被实例化。但这不是我的实际怀疑。在SCJP Book中,我遇到了一行代码,告诉我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作为final类,console()作为静态方法。

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

希望我的问题很明确。提前致谢。 !

2 个答案:

答案 0 :(得分:3)

最终的课程无法实例化

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

  

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

     

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

System.console()

  

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

     

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

     

如果此虚拟机具有控制台,则它由此类的唯一实例表示,可以通过调用System.console()方法来获取。

     

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

console()是某种工厂方法,它为您提供与当前JVM关联的Console对象。 System类了解运行它的JVM,它是返回Console对象的完美候选者。

Console c = System.console();

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

答案 1 :(得分:1)

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

  

所以我明白最终的课程无法实例化

最终类无法扩展,但可以实例化。 FYI它是抽象类而不能实例化。