我知道为什么这是C ++中的错误。
class A
{
A b;
};
int main() {}
因为type of b is unresolved at the compile time
。
那么为什么下面的代码是正确的?
class A
{
static A b;
}
int main() {}
如果变量b的类型是静态的吗?
最后我惊讶地发现以下代码适用于JAVA:
public class Main
{
Main g;
public static void main(String[] args)
{
System.out.println("hi");
}
}
为什么会这样?我知道它们特定于类而不是实例的静态变量。但这并没有给出上述问题的答案....请给我一些启示。
答案 0 :(得分:5)
由于:
static A b;
(在类本身中)不是定义,所以完整 不必定义类。
Java有不同的规则,并没有一个概念
不完全类型。当然,Java中的变量永远不会
用户定义的对象类型,但引用(更像是C ++
指针)对象类型。 C ++与变量的等价物
Java中的声明将是Main* g;
。
答案 1 :(得分:4)
因为b的类型在编译时未解析。
不,这是因为此时b
的类型不完整。您可以声明一个不完整类型的变量,但不能 define 一个。定义分配空间来存储对象,为此必须知道对象的大小。
静态成员声明只是一个声明;如果使用变量,必须在别处定义变量。所以在课堂上宣布这一点很好。
非静态成员声明也是一个定义;它为类中的变量分配空间,为此必须完成类型。 (另外,对于非空对象来说,逻辑上不可能包含相同类型的对象。)
Java没有不完整类型的概念,并允许任何类包含(引用)任何其他类。