我被困在一个无法为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测试。所以请详细解释一下这个。
希望我的问题很明确。提前致谢。 !
答案 0 :(得分:3)
最终的课程无法实例化
这是错误的,final
类不能被子类化。如果构造函数可见,则可以使用new
运算符对其进行实例化。我猜Console
类有private
构造函数。 抽象类无法立即显示。请参阅JLS 8.1.1.2:
如果一个类的定义完整且不需要或不需要子类,则可以将其声明为final。
如果最终类的名称出现在另一个类声明的extends子句(第8.1.4节)中,则是编译时错误;这意味着最终的类不能有任何子类。
返回与当前Java虚拟机关联的唯一Console对象(如果有)。
虚拟机是否具有控制台取决于底层平台以及虚拟机的调用方式。如果从交互式命令行启动虚拟机而不重定向标准输入和输出流,则其控制台将存在,并且通常将连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如后台作业调度程序,那么它通常没有控制台。
如果此虚拟机具有控制台,则它由此类的唯一实例表示,可以通过调用System.console()方法来获取。
如果没有可用的控制台设备,则该方法的调用将返回null。
console()
是某种工厂方法,它为您提供与当前JVM关联的Console
对象。 System
类了解运行它的JVM,它是返回Console
对象的完美候选者。
Console c = System.console();
System.console()
为我们提供了对Console
对象的引用,并且您将对象引用分配给变量c
。这样,您可以使用该引用变量c
来访问Console
对象的属性或方法。
答案 1 :(得分:1)
我相信你理解中的错误就在这里:
所以我明白最终的课程无法实例化
最终类无法扩展,但可以实例化。 FYI它是抽象类而不能实例化。