对象是静态的

时间:2014-11-03 06:42:15

标签: java static inner-classes

我看到了这段代码,尽管我认为我在Java中得到了静态概念,但我有点困惑。任何人都能向我解释一下静态物体是如何起作用的吗?

我的代码:

package com.oracle.certification.sampleTest;

public class Person {
    static class Mail {
        static String desc="Male";
    }

    static Gender Mail=new Gender();
}

package com.oracle.certification.sampleTest;

public class Gender {
    String desc="Gender";
}

package com.oracle.certification.sampleTest;

public class Human {
    public static void main(String str[]) {
        System.out.println(Person.Mail.desc);
    }
}

当人类运行时,O / P是性别'不是'男性',即使des =性别是非静止的,des =男性也是静态的,具有静态的内部类别。我也不需要在Hman中导入课程?对不起,我对内部课程知之甚少。首先。

1 个答案:

答案 0 :(得分:1)

  

任何人都可以向我解释一下,静态物体是如何起作用的吗?

基本上,该上下文中的static表示所讨论的实体附加到类本身,而不是附加到类的对象。因此,static只有一个你声明的实例:

class T {
   public static int staticMember = 0;  // one variable stored in memory
   public int nonStaticMember = 0;      // as many variables stored in memory as objects are created from the class
}

另见What does the 'static' keyword do in a class?

但是,您的问题不一定是对静态类的误解,而是名称解析的一个极端情况:您在一个范围内声明类型和成员变量具有相同的名称(Mail)(在Person类 - 虽然人们可能认为这甚至不可能,但Java语言确实允许这样做,并定义了一些规则来确定使用哪一个。

来自JLS

  

一个简单的名称可能出现在上下文中,它可能被解释为变量的名称,类型或包。在这些情况下,§6.5的规则指定将优先选择变量

...
static class Mail {   // a Type
}

static Gender Mail ...   // a Variable with the same name 
                         // - the compiler chooses to use this one
...

因此,在引用Person.Mail时,编译器会选择变量,而不是类型(内部类)。