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

在块内定义的内部类(如Java中的方法)不能有任何修饰符,甚至不能是公共修饰符。为什么?,java,Java,在Java中,类可以永远被限定为私有类或受保护类。它可以一直公开。很明显,这是毫无疑问的 但是,Java中的内部类可以用这些修饰符中的任何一个指定为private、protected或public。内部类也可以像方法一样在单个块中定义。在这种情况下,内部类不能用这些修饰符中的任何一个指定,私有、公共或受保护 下面的简单程序编译时没有错误,工作正常 package amazingjava; final class Demo { public class Really {

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


但是,Java中的内部类可以用这些修饰符中的任何一个指定为private、protected或public。内部类也可以像方法一样在单个块中定义。在这种情况下,内部类不能用这些修饰符中的任何一个指定,私有、公共或受保护


下面的简单程序编译时没有错误,工作正常

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来限定这些类,就会出现编译时错误!为什么?在这种情况下,编译器使用哪个默认修饰符?

这是因为您在方法中声明了它,而不是直接在类中声明了它。不能减少或增加此类方法局部类/变量的可见性。无论如何,这没有任何意义,它始终是本地方法,您无法从外部访问它。默认修饰符只是“默认”可见性(即没有其他修饰符)。

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

内部类是在堆中定义的,因此它们可以从其他类中看到,并且可以使用不同的修饰符。有些内部类对外部世界可见,有些则不可见


这里有一篇关于方法之间差异的文章。

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


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

这些是本地内部类(在方法中定义)。不允许使用任何访问修饰符。

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

对不起,这是错的。顶级Java类可能是公共的,并且受包保护(当未定义修饰符时)


第二个问题的答案很简单。定义内部类时,可以从外部访问它:
newoutside.inner()
。但是,如果将内部类定义到方法中,则无法从方法外部到达该类,因此公共修饰符在这里是不相关的

如何从方法外部引用此类类?Java对您来说还不够详细吗?我的问题是,它们不能从这个静态方法之外的任何其他类访问,所以给它一个修饰符是没有意义的。。。。不能有任何修改器。。。看起来您可以将它们设置为
final
abstract
:d感谢您指出我的错误。对于内部类,您可以使用private和protected,但实际上它们分别替换为package protected和public(在类文件中)只有构造函数分别变为private和protected。我认为所有的类都存储在方法区域中,只有对象存储在HEAP中。