我看到了这段代码,尽管我认为我在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中导入课程?对不起,我对内部课程知之甚少。首先。
答案 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
时,编译器会选择变量,而不是类型(内部类)。