我想知道是否有人确切知道代码行开始时会发生什么:
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行中出错了吗? (显然由于铸造功能不在那里,但为什么不呢?)
答案 0 :(得分:6)
由于您在第9行上没有引用变量,编译器并不认为此语句有效。
如果你有一个更具体的引用变量,那么需要强制转换。输入对象本身。例如,当您执行上传时,您不需要它:
Class obj = new Math();
当你正在进行垂头丧气时,你需要一个明确的演员阵容:
Class obj = new Math();
Math math = (Math) obj;
答案 1 :(得分:3)
(Class)new Math()
做了两件事:
由于Math扩展了Class,因此每个Math实例都是一个Class实例,并且您不需要任何强制转换来将Math实例分配给Class类型的变量。因此,演员阵容完全没用。由于您没有将创建的Math实例分配给任何变量,因此演员阵容更加无用。
答案 2 :(得分:1)
这两行都构建了一个Math
实例。因为在这种情况下,Math
是Class
的子类(这有点不寻常,但好吧,我正在玩)。
第9行,(Class)new Math();
告诉JVM忘记它是Class
的专用实例,并且只是将它视为通用Class
对象。这基本上意味着如果你这样做了:
Class c = (Class)new Math();
和Math
的方法未从Class
继承,您将无法在对象c
上调用它们。
但请注意,c
实际上仍是Math
的实例。
我不确定这个示例中的重点是什么,但是如果您希望代码在对象的泛型定义之外工作而不担心特定的实现,通常会这样做。我不知道,整个例子对我来说似乎很傻。
答案 3 :(得分:0)
在这种特殊情况下,这只是因为没有对第9行的变量进行赋值。