访谈:是否可能创建一个没有名称的类?

7
在我的面试中,面试官问我:“我们能否创建没有名称的类?”由于我不确定是否真的可以创建没有名称的类,所以我回答“不行”。后来,我尝试搜索该问题的答案,但是并没有找到明确的答案。如果有人能够清楚地解释这个类是什么,以及如何实例化这个类,我将不胜感激。

1
+1:虽然问题本身相当简单,但它让我开始思考新的事情。 - John Dibling
3个回答

12

是的,这被称为匿名类/结构。

在C++中:

class {
} x;

x是一种类型的对象,你不能再创建更多了,因为,嗯,毕竟如果这个类没有名字,你该怎么做呢……

如何调用构造函数和析构函数?

你不需要。在Java和C++中,构造函数和析构函数与类名相同(它们不像PHP中是__construct或其他什么名字),而缺少的类名有点儿妨碍。


1
这样的类不能有用户声明的构造函数。 - Robᵩ
这意味着我们不能创建该类的任何对象... ?? - Ravi
请提供一些好的链接,让我可以学习更多关于这个类的知识...我的意思是...为什么我们需要这种类型的类...等等... - Ravi
2
C++03标准实际上将这些类称为“未命名”类,而不是“匿名”类。你可以像这样使用typedef构造,如:typedef class {} Thingy; 从而更容易地实例化这些东西:Thingy t; 但是,如果你在C++中这样做,我会想知道为什么你首先想让它没有名称。也许是为了使非平凡构造函数的声明变得不可能?嗯… - John Dibling
@LuchianGrigore:我以前从来没有想过创建这样的结构。我正在考虑可能的用途。 - John Dibling
显示剩余6条评论

6

在Java中,它也被称为匿名类。

// create a new instance of an anonymous class.
Serializable s = new Serializable() {
};

注意:在JVM中,所有的类都有一个名称,它是由编译器为您生成的。

你不能定义构造函数,但它可以有一个实例初始化块来完成同样的事情。


你是指实例初始化块吗? - Jon Skeet
@JonSkeet 谢谢,匿名类不能有静态初始化块。 ;) - Peter Lawrey
匿名类的描述总是让我感到不太对劲。这个类总是有一个名称,但实例可能没有。 - jn1kk
在我看来,除非您添加一个像“名称”这样的字段,否则实例没有名称。类具有给定的名称,或者它是匿名的(在这种情况下,编译器会为其命名)。 - Peter Lawrey
在JVM中,所有类都有一个名称,从技术上讲,您可以创建一个名称为空字符串的类。我还没有尝试过使用nullClassLoader.checkName(String)认为null是可以接受的,但我不确定JVM代码是否也是如此(而且我懒得去查)。 - bestsss

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接