内部类

Posted Mercuryji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类相关的知识,希望对你有一定的参考价值。

一、关于内部类的定义

将类定义在另一个类的内部,则成为内部类,内部类生成的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();
        }
    }

 

以上是关于内部类的主要内容,如果未能解决你的问题,请参考以下文章

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

为啥片段类应该是公开的?

ForegroundService没有从片段开始?

在内部片段类中使用ListView

自定义无内存泄漏的Handler内部类

底部导航 如何从片段内部更改片段