繁体   English   中英

为什么我不能使用类对象访问java中的内部静态类

[英]Why can't I access an inner static class in java with class object

当我使用类的实例访问静态成员时,它可以工作,那么为什么静态内部类会出错?
在 C++ 中,我们可以使用实例以及类名访问静态成员。
它在 Java 中有何不同。

class OuterClass{
    static public int x;
    public static void show(){
        System.out.println(x);
    }
    public static class InnerClass{
        static public int y;
    }
}

public class MyApp {
    public static void main(String[] args){
        OuterClass obj = new OuterClass();
        obj.x= 5;
        System.out.println(obj.x);   // This runs fine 
        obj.InnerClass.y = 10;       // Error
        System.out.println(obj.InnerClass.y);
        OuterClass.InnerClass.y=10;  // This works why ?
        System.out.println(OuterClass.InnerClass.y);
    }
}

如果这是一个愚蠢的问题,我很抱歉,Java 新手希望您理解。
问候

obj.x = 5; System.out.println(obj.x);

是的,这有效,但“偶然”。 Java语言规范允许这一点,但请注意,每个掉毛工具在那里,和Java当前的核心工程团队,都会告诉你,这是不好的代码风格,你不应该这样做。

在罗马时,就像罗马人一样:如果您更喜欢这种代码风格,那是……无关紧要。 不要写这个。 你不是在自己的小泡泡里,你读的是别人写的代码,别人会读你写的代码并使用你写的代码。

在 java 中仍然允许这样做的唯一原因是因为 java 不喜欢破坏向后兼容性。

它很someExpr.someThing的原因是someExpr.someThing强烈暗示someExpr以任何方式或形式相关。 就像在运行时一样, someExpr被评估,并且它指向的任何对象(请记住,在 Java 中,除原语之外的所有变量都像 C 指针,但在 Java 中我们称它们为引用。Potayto Potahto)然后用于获取该对象字段或调用该方法。

但如果someThing是一个静态概念,则不会发生这种情况:为了简单证明这一点,将someExpr null 并注意它是如何工作的(没有抛出 NullPointerException),从而证明没有发生解引用。

这很混乱。 如果someThing是静态的,那么它属于该类而不是它的任何特定实例,所以这样写: OuterClass.x

obj.InnerClass.y = 10; System.out.println(obj.InnerClass.y);

是的,错误。 虽然您可以通过编写x.fieldOrMethod来引用静态方法和静态字段,其中 x 是一个表达式,其静态(编译时,而不是运行时)类型是具有fieldOrMethod作为字段或方法成员的类型,但它有效,但如果不是是内部类型。 为什么? 因为java规范是这么说的。

请注意,内部类型是在 java 1.1 中添加的,我很确定 lang 团队已经意识到允许obj.staticThing是一个设计错误,因此他们故意决定不扩展和延长该错误。 它是在火上,为什么你应该让一个习惯了这种风格的进一步燃料; 它并不能始终如一地工作。

OuterClass.InnerClass.y=10; System.out.println(OuterClass.InnerClass.y);

最后我们得到正确的代码。 不仅它有效,而且这就是你应该这样做的方式。 OuterClass.InnerClass是将InnerClass名字:指刚上课的时候所有的类都在影响“静态”:这并不是说有将InnerClass的一个变体为在OuterClass(不即使是将InnerClass非静态)的每个实例:在概念“InnerClass”只存在一次。 无论 InnerClass 是否为静态,只有一个java.lang.Class<?>实例来表示“InnerClass”。 你还有什么其他的方式来引用InnerClass obj.InnerClass意义为零——引用 InnerClass 不需要 obj 的实例——提供不相关和未使用的信息(在这种情况下, obj引用)是很奇怪的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM