这是采访中提出的问题。在下面的代码片段中做什么foo a
和表示什么。foo a()
class foo
{
foo a;
foo a();
}
foo a 和 foo a() 会做什么?面试官没有提到这是java还是c++。他们希望我用 C++ 和 Java 给出答案。
在 C++ 中,第一行是错误(类不能包含自身的实例)。第二行声明了一个foo
按值返回实例的方法。最后还有一个缺少的分号。
在 Java 中,第一行声明了一个数据成员,它是对foo
. 第二行是一个错误,因为该方法必须有一个主体。
总之,这两种语言中的任何一种都不是有效的代码。:-)
从语法上讲,它在 Java 方面是不正确的。其他人已经解释过了。
然而,假设它是伪代码,我想基本的答案是这样的:
foo a;
是一个名为a
type的变量foo
。
foo a();
是一个名为a
返回类型对象的方法foo
。
foo a;
声明一个对 .的引用的字段 。a
foo
foo a();
是 Java 中的错误。这是一个方法声明(没有主体的方法)。在 Java 中,这样的抽象方法必须用abstract
关键字限定:
abstract foo a();
这声明了一个返回引用的抽象方法。每个包含抽象方法声明的类定义都必须使用关键字本身进行限定。在您的情况下,类声明应如下所示:a
foo
abstract
abstract class foo {
来自 Java 语言规范 - §8.1.1.1:
普通类可能有抽象方法,即已声明但尚未实现的方法,前提是它们是抽象类。如果非抽象的普通类包含抽象方法,则会发生编译时错误。
它是一个返回类型 foo 的方法,因为类不是抽象的编译器会抛出错误
对于 Java
class foo
{
foo a;
foo a();
}
第一行声明了对名为“a”的“foo”对象的引用。该值将为空。
第二行是一个错误。它试图声明一个名为“a”的方法,该方法返回一个“foo”,但该方法没有主体。需要将类和方法声明为抽象才能使其工作,或者必须为“a”方法提供一个主体。