在类中声明的静态变量,其类型与类的类型相同

时间:2013-05-13 11:00:42

标签: java c++ class static

我知道为什么这是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");
}
}

为什么会这样?我知道它们特定于类而不是实例的静态变量。但这并没有给出上述问题的答案....请给我一些启示。

2 个答案:

答案 0 :(得分:5)

由于:

static A b;

(在类本身中)不是定义,所以完整 不必定义类。

Java有不同的规则,并没有一个概念 不完全类型。当然,Java中的变量永远不会 用户定义的对象类型,但引用(更像是C ++ 指针)对象类型。 C ++与变量的等价物 Java中的声明将是Main* g;

答案 1 :(得分:4)

  

因为b的类型在编译时未解析。

不,这是因为此时b的类型不完整。您可以声明一个不完整类型的变量,但不能 define 一个。定义分配空间来存储对象,为此必须知道对象的大小。

静态成员声明只是一个声明;如果使用变量,必须在别处定义变量。所以在课堂上宣布这一点很好。

非静态成员声明也是一个定义;它为类中的变量分配空间,为此必须完成类型。 (另外,对于非空对象来说,逻辑上不可能包含相同类型的对象。)

Java没有不完整类型的概念,并允许任何类包含(引用)任何其他类。