• Java内部类


    1.内部类分为4种:

    1. 成员内部类(定义在类里面的类),又称普通内部类
    2. 局部内部类(定义在方法体或者代码块里面的类)
    3. 静态内部类(static关键字修饰的内部类)
    4. 匿名内部类

    2.内部类的特点:

    • 可以使用外部类的属性,即使这个属性是private的也可以使用
    • 可以调用外部类的方法
    • 在多线程时常用内部类-->后来进化到了lambeda表达式

    3.1 成员内部类

    public class OuterClass {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
    //这里在外部类里面定义了一个成员内部类(普通内部类)
    class InnerClass { public InnerClass() { name = "Jacike CHAN";//内部类可以使用外部类的属性和方法 age = 66; } public void display() { System.out.println("姓名:" + getName());//调用外部类的getName()方法 System.out.println("年龄:" + getAge());//调用外部类的getAge()方法 } } public static void main(String[] args) { OuterClass outer = new OuterClass(); InnerClass inner = outer.new InnerClass();//创建内部类对象 inner.display(); } }

    创建成员内部类对象的注意点:

    不能直接new一个成员内部类对象,需要先常见外部类对象,再用外部对对象.new InnerClass()的方式去创建普通内部类对象

    OuterClass outer = new OuterClass();
    InnerClass inner = outer.new InnerClass();

    3.2 局部内部类:

    import com.sun.org.apache.bcel.internal.classfile.InnerClass;
    import javafx.scene.effect.InnerShadow;
    
    public class OuterClass {
        public int ofield1 = 1;
        protected int ofield2 = 2;
        int ofield3 = 3;
        private int ofield4 = 4;
    
        public OuterClass() {
            System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
        }
    
        private void outerTest() {
            class A {
                public A() {
                    System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
                    System.out.println("其外部类的fied1字段值为:" + ofield1);
                    System.out.println("其外部类的fied2字段值为:" + ofield2);
                    System.out.println("其外部类的fied3字段值为:" + ofield3);
                    System.out.println("其外部类的fied4字段值为:" + ofield4);
                }
            }
    
            A a = new A();
    
            {
                class B {
                    public B() {
                        System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
                        System.out.println("其外部类的fied1字段值为:" + ofield1);
                        System.out.println("其外部类的fied2字段值为:" + ofield2);
                        System.out.println("其外部类的fied3字段值为:" + ofield3);
                        System.out.println("其外部类的fied4字段值为:" + ofield4);
                    }
                }
                B b = new B();
            }
        }
    
        public static void main(String[] args) {
            OuterClass outer = new OuterClass();
            outer.outerTest();
        }
    }

    结果:

    在外部类里面创建OuterClass类对象.
    在外部类里面创建A类对象.
    其外部类的fied1字段值为:1
    其外部类的fied2字段值为:2
    其外部类的fied3字段值为:3
    其外部类的fied4字段值为:4
    在外部类里面创建B类对象.
    其外部类的fied1字段值为:1
    其外部类的fied2字段值为:2
    其外部类的fied3字段值为:3
    其外部类的fied4字段值为:4

    3.3静态内部类:

    public class OuterClass {
        public int field10 = 10;
    
        public OuterClass() {
            System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象.");
    
            InnerClass inner = new InnerClass();
            System.out.println("静态内部类fied1字段值为:" + inner.field1);
            System.out.println("静态内部类fied2字段值为:" + inner.field2);
            System.out.println("静态内部类fied3字段值为:" + inner.field3);
            System.out.println("静态内部类fied4字段值为:" + inner.field4);
            System.out.println("静态内部类fied5字段值为:" + InnerClass.filed5);
        }
    
        static class InnerClass {
            public int field1 = 1;
            protected int field2 = 2;
            int field3 = 3;
            private int field4 = 4;
            static int filed5 = 5;
    
            public InnerClass() {
                System.out.println("在静态内部类里面创建" + this.getClass().getSimpleName() + "类对象.");
                //   System.out.println("在静态内部类调用外部类的fied10字段值为:" + field10);
            }
    
        }
    
        public static void main(String[] args) {
            //可以通过外部类.内部类的方式创建静态内部类对象
            OuterClass.InnerClass in = new OuterClass.InnerClass();
    
            //也可以直接创建静态内部类对象
            InnerClass inner = new InnerClass();
            OuterClass out = new OuterClass();
        }
    }

    结果:

    在静态内部类里面创建InnerClass类对象.
    在静态内部类里面创建InnerClass类对象.
    在外部类里面创建OuterClass类对象.
    在静态内部类里面创建InnerClass类对象.
    静态内部类fied1字段值为:1
    静态内部类fied2字段值为:2
    静态内部类fied3字段值为:3
    静态内部类fied4字段值为:4
    静态内部类fied5字段值为:5

    3.4匿名内部类:

    匿名内部类在多线程和java图形化界面编程时用的比较多。

    它后来进化成了lambeda表达式

    public class OuterClass {
        public int field1 = 1;
        protected int field2 = 2;
        int field3 = 3;
        private int field4 = 4;
        static int filed5 = 5;
    
        public OuterClass() {
            System.out.println("这是外部内的构造方法--创建对象:" + this.getClass().getSimpleName());
        }
    
    
        interface ITest {
            void test();
        }
    
        public void anonymousTest() {
            ITest it = new ITest() {
                @Override
                public void test() {
                    System.out.println("我在匿名内部类里面");
                    System.out.println("这是匿名内部类的对象:" + this.getClass());
                    System.out.println("其外部类的 field1 字段的值为: " + field1);
                    System.out.println("其外部类的 field2 字段的值为: " + field2);
                    System.out.println("其外部类的 field3 字段的值为: " + field3);
                    System.out.println("其外部类的 field4 字段的值为: " + field4);
                    System.out.println("其外部类的 field5 字段的值为: " + filed5);
                }
            };
            it.test();
        }
    
        public static void main(String[] args) {
            OuterClass out = new OuterClass();
            out.anonymousTest();
        }
    }

    结果:

    这是外部内的构造方法--创建对象:OuterClass
    我在匿名内部类里面
    这是匿名内部类的对象:class OuterClass$1
    其外部类的 field1 字段的值为: 1
    其外部类的 field2 字段的值为: 2
    其外部类的 field3 字段的值为: 3
    其外部类的 field4 字段的值为: 4
    其外部类的 field5 字段的值为: 5

    参考资料:

    Oracle官方文档--匿名内部的语法结构

    https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

    其它很有用的参考:

    这个例子容易理解

    https://blog.csdn.net/hacker_zhidian/article/details/82193100

    详细的帖子

    https://www.cnblogs.com/chenssy/p/3388487.html

    后记:

    2020年3月8日 星期日 上海 晴转多云 气温 13度,比较冷。

  • 相关阅读:
    C++ 算法03算法设计的常用思想
    C++ 算法02算法设计的基础
    C++ 算法01
    字符串Hash入门
    CSP2020总结
    关于树状数组的应用
    Cookies题解
    博客迁移
    斜率优化(转载)
    单调队列优化和决策单调性优化
  • 原文地址:https://www.cnblogs.com/majestyking/p/12443756.html
Copyright © 2020-2023  润新知