zoukankan      html  css  js  c++  java
  • 内部类

    一、关于内部类的定义

    将类定义在另一个类的内部,则成为内部类,内部类生成的class文件为:外部类$内部类;

    public class Outer {
        int num = 10;
        class Inner{
            int age = 10;
            public void print(){
                System.out.print("内部类");
            }
        }
        public void show(){
            System.out.print("外部类");
        }
    }

    根据类定义的位置可以分为成员内部类和局部内部类

    二、成员内部类的访问方式

    1.内部类可以直接访问外部类的成员属性

    2.外部类需要访问内部类的成员属性时需要创建内部类的对象

        1)在外部类的成员函数中创建内部类的对象,通过内部类对象直接访问内部类的成员。

        2)在其他类中直接创建内部类的对象。

            Outer.Inner inner = new Outer().new Inner();

    三、成员内部类访问细节

    1.成员内部类被私有化

      不能在其他类中直接创建内部类

    2.成员内部类中有静态成员时,该内部类必须使用static修饰,当成员内部类被static修饰时,可通过类名直接访问静态成员;

       Outer.Inner.静态成员

    四、当外部类,成员内部类,成员内部类的成员方法中存在同名成员变量时,在成员方法中该如何访问这三个量?

         1、访问成员方法中量:变量名

         2、访问成员内部类中:this.变量名

         3、访问外部类中:外部类.this.变量名

    public class Outer {
        int num = 10;
        class Inner{
            int num= 20;
            public void print(){
                int num = 30;
                System.out.print("num");//30
                System.out.print("this.num");//20
                System.out.print("Outer.this.num");//10
            }
        }
    }

    五、局部内部类

            包含在外部类的方法的内部的类,则为局部内部类

    六、局部内部类的访问:可以在包含内部类的方法中直接创建对象进行访问;

            注意:局部内部类只能访问所在方法的final属性

    七、匿名内部类

           就是没有类名的内部类

           作用:简化书写

           格式:

            new 父类或接口(){

                执行代码;

            }

    当只有一个调用一个内部类的方法时:

    abstract class Inner{
        abstract void show();
    }
    
    public class Outer {
        public void print(){
            new Inner() {
                public void show(){
                    System.out.print("内部类");
                }
            }.show();
        }
    }

    当需要调用内部类的两个或以上方法时,可使该类指向一个变量

    interface Inner{
        void show1();
        void show2();
    }
    
    public class Outer {
        Inner in = new Inner() {
            public void show1() {
                System.out.print("内部类1");
            }
    
            public void show2() {
                System.out.print("内部类2"); 
            }
        };
            public void print() {
                in.show1();
                in.show2();
            }
        }
  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/mercuryji/p/innerclass.html
Copyright © 2011-2022 走看看