在块中定义的内部类(如Java中的方法)不能有任何修饰符,甚至不能是public.为什么



在Java中,类永远不能被限定为私有或受保护。它可以一直是public。很明显,这是毫无疑问的。


然而,Java中的

内部类可以被指定为private、protected或public。内部类也可以像方法一样在单独的块中定义。在这种情况下,内部类不能用private、public或protected这些修饰符中的任何一个来指定。


下面这个简单的程序编译后没有错误,运行正常。

package amazingjava;
final class Demo
{
    public class Really
    {
        public class Quite
        {
            public class Surprising
            {
                @Override
                public String toString()
                {
                    return( "it really works !" );
                }
            }
        }
    }
}
final public class Main
{
    public static void main(String[] args)
    {
        System.out.println( "It may be hard to believe, but " + new Demo().new   
        Really().new Quite().new Surprising().toString());
        class Really
        {
            class Quite
            {
                class Surprising
                {
                    @Override
                    public String toString()
                    {
                        return( "it really works !" );
                    }
                }
            }
        }
        System.out.println( "It may be hard to believe, but " + new Really().new 
       Quite().new Surprising().toString());
    }
}

输出如下:

这可能很难相信,但它确实有效!

这可能很难相信,但它确实有效!


现在,我的问题只是上面例子中main()方法内部声明的内部类不能有任何修饰符。试图用任何修饰符private、protected或甚至public来限定这些类都会导致编译时错误!为什么?在这种情况下,编译器使用哪个默认修饰符?

在方法中定义的内部类被视为该方法中声明的任何变量-并且这些变量是LOCAL。局部变量或类不能有除FINAL以外的任何修饰符。

在另一个类中定义的内部类被视为实例变量,因此实例类或变量可以是公共私有的,也可以没有标识符。

这是因为您在方法中声明了它,而不是直接在类中声明。您不能减少或增加这种方法局部类/变量的可见性。这没有任何意义,它总是方法本地的,你不能从外部访问它。默认的修饰符只是"默认的"可见性(即没有额外的修饰符)。

在Java中,一个类永远不能被限定为私有或受保护。它可以一直是公开的。很明显,这是毫无疑问的。

对不起,这是错误的。顶级Java类可以是公共的和受包保护的(当定义了not修饰符时)。

第二个问题的答案很简单。当您定义内部类时,它可以从外部访问:new Outside.Inner()。但是,如果您将内部类定义为方法,则无法从方法外部到达该类,因此公共修饰符在那里无关紧要。

原因是这些类是在堆栈上定义的。所有方法参数和局部变量都是在堆栈上声明和初始化的。它的本质是限制方法体内部的可见性。

内部类是在堆中定义的,因此它们对其他类是可见的,因此有必要使用不同的修饰符。一些内部类可能对外部世界可见,而另一些则不可见。

这是一篇关于Java中Stack和Heap区别的文章。

这些是本地内部类(在方法内部定义)。

最新更新