首页 > 编程语言 > 详细

Java学习之内部类

时间:2020-09-24 23:12:30      阅读:54      评论:0      收藏:0      [点我收藏+]

本来写过一次的,后来被我连同反编译后的文件一块删了,就重写了一次

 

//TODO总结

 

Java内部类详解 这篇文章写得确实不错。

 

public class OuterClass {
    static int A = 10;
    int a = 10;

    /*
     * 成员内部类中不能声明静态成员变量以及方法,但可以有静态常量
     * 
     * 成员内部类创建对象时依赖于外部类的实例,成员内部类在实例化时会有一个依赖的外部类的引用(可以用它有一个外部类类型的实例的指针来理解)
     * 
     * 成员内部类在访问外部类中同名的成员是可以用 【外部类.this.成员名用来调用】 变量或方法
     */
    class InnerClass {
//        static int A = 20;// The field A cannot be declared static in a non-static inner type, unless
//                            // initialized with a constant expression
        static final int A = 20;

//        static void staticMethod() {// The method staticMethod cannot be declared static; static methods can only be
//                                    // declared in a static or top level type
//        }

        int a = 20;

        void method() {
            System.out.println("InnerClass.method");
            System.out.println(a);
            System.out.println(OuterClass.this.a);
//            InnerClass.this.method();
        }

    }

    /*
     * 静态内部类中可以声明静态和非静态的成员变量还有方法,但不能使用this关键字,也不能访问外部类中的非静态成员
     * 
     * 静态内部类创建对象时不依赖外部类的实例,外部类的实例未创建就无法调用其非静态的成员
     */
    static class StaticInnerClass {
        static int A = 30;

        static void staticMethod() {
        }

        int a = 30;

        void method() {
            System.out.println("StaticInnerClass.method");
            System.out.println(a);
//            System.out.println(OuterClass.this.a);//No enclosing instance of the type OuterClass is accessible in scope
        }

    }

    void method() {
        int local = 3;
        String str = "str";
        /*
         * 局部内部类中不能声明静态成员变量以及方法,但可以有静态常量
         * 
         * 局部类中不能改变外部方法中的变量,虽然可以调用(在JDK8之前,如果要在匿名内部类别中存取局部变量,则该局部变量必须是final,否则会发生编译错误),
         * 但本质上是一种程序蜜糖,局部内部类中调用的变量是赋值给了final修饰后局部内部类中的变量——也就是常量。
         * 外部方法中的变量声明周期结束,但局部内部类中复制后变量还在。匿名内部类也是如此。
         * 
         * 参考:https://www.cnblogs.com/dolphin0520/p/3811445.html
         * https://openhome.cc/Gossip/Java/AnonymousInnerClass.html
         */
        class InnerClass {

//            static int A = 40;// - The field A cannot be declared static in a non-static inner type, unless
//                                // initialized with a constant expression
            static final int A = 40;

//            static void staticMethod() {// The method staticMethod cannot be declared static; static methods can only be
//                                        // declared in a static or top level type
//            }

            int a = 40;

            void method() {
//                local = 3;//Local variable local defined in an enclosing scope must be final or effectively final
//                str = "";//Local variable str defined in an enclosing scope must be final or effectively final
                System.out.println("InnerClass.method");
                System.out.println(a);
                System.out.println(OuterClass.this.a);
            }
        }
        /*
         * 匿名内部类默认继承类或接口
         * 
         * 匿名内部类中不能声明静态成员变量以及方法,但可以有静态常量
         */
        new OuterClass() {
//            static int A = 50;// - The field A cannot be declared static in a non-static inner type, unless
//                                // initialized with a constant expression
            static final int A = 50;
//            static void staticMethod() {// The method staticMethod cannot be declared static; static methods can only be
//                                        // declared in a static or top level type
//            }

            int a = 50;

            @Override
            void method() {
//                local = 5;//Local variable local defined in an enclosing scope must be final or effectively final
//                str = "";//Local variable str defined in an enclosing scope must be final or effectively final
                System.out.println("OuterClass.method");
                System.out.println(a);
                System.out.println(OuterClass.this.a);
            }
        }.method();
    }

    public static void main(String[] args) {
        new OuterClass().method();
    }
}

 

Java学习之内部类

原文:https://www.cnblogs.com/pong137/p/13727144.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!