[英]Understanding “new” keyword in java
我想知道是否有人确切知道代码行发生时会发生什么:
class Class{}
class Math extends Class{}
class UseClasses{
public static void main (String[]args)
{
new Math(); //Line 8
(Class)new Math();// Line 9
}
我完全理解“new keyword”在堆内存中充当对象实例创建者。 但是,在前面的代码中,您可以看到第9行对此关键字(新)的使用不正常。 第8行没关系并且编译得很好。 但是第9行需要将内容分配给其他一些引用。 因此,这意味着每次存在强制转换操作数时,在这种情况下(Class)new Math,将实例化新的引用(强调引用而不是对象)。
它以这种方式工作吗? 如果没有,你能解释一下为什么它在第8行编译得很好并且它在第9行中出错了吗? (显然由于铸造功能不在那里,但为什么不呢?)
由于第9行没有引用变量,编译器不认为此语句有效。
如果您具有对象本身的“更具体”类型的引用变量,则需要强制转换。 例如,当您执行上传时,您不需要它:
Class obj = new Math();
当你执行向下转换时,你需要一个明确的演员:
Class obj = new Math();
Math math = (Math) obj;
(Class)new Math()
做两件事:
由于Math扩展了Class,因此每个Math实例都是一个Class实例,并且您不需要任何强制转换来将Math实例分配给Class类型的变量。 因此,演员阵容完全没用。 由于您没有将创建的Math实例分配给任何变量,因此强制转换更无用。
这两行都构建了一个Math
实例。 因为在这种情况下, Math
是Class
的子Class
(这有点不寻常,但好吧,我正在玩)。
所以第9行, (Class)new Math();
告诉JVM忘记它是Class
的一个专门实例,只是把它当成一个普通的Class
对象。 这基本上意味着,如果你这样做:
Class c = (Class)new Math();
和Math
没有从Class
继承的方法,你将无法在对象c
上调用它们。
但请注意, c
实际上仍然是Math
一个实例。
我不确定这个示例中的重点是什么,但是如果您希望代码在对象的泛型定义之外工作而不担心特定的实现,通常会这样做。 我不知道,整个例子对我来说似乎很傻。
在这种特殊情况下,这只是因为没有对第9行的变量进行赋值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.