2014-11-03 172 views
-1

我看过这段代码,尽管我觉得我在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

一个对象不是'static'。这不是一个存在的概念。一个变量可以声明为“静态”。 – 2014-11-03 06:42:58

+1

使用'Mail'作为类名和字段名会使您的代码更加困惑...... – 2014-11-03 06:46:20

+0

Java教程[嵌套类](http://docs.oracle.com/javase/tutorial/java/javaOO /nested.html) – DavidPostill 2014-11-03 06:50:55

回答

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?

见然而,你的问题不一定是静态类的误解,但名称解析的一个角落里的情况:你在一个范围内(在Person类中)同时声明类型和成员变量同名(Mail) - 虽然人们可能认为这应该不可能,但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的情况下,编译器选择的变量,而不是类型(内部类)。

+0

谢谢,这是我甚至想到的另一个概念。谢谢你让我知道。现在我的问题是静态对象是如何工作的?我有4年的Java开发经验,但从来没有见过,并反对静态。 – Gpar 2014-11-03 07:11:14

+0

我现在明白了。经过漫长的斗争。感谢所有人,尤其是@Andreas ...... – Gpar 2014-11-03 12:10:08