内部类

Posted

tags:

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

what:
    在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类。
how:
    格式:
        class 外部类名{
                修饰符 class 内部类名{
            }
        }
why:
        1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。
        2. 对于同一个包中的其他类来说,内部类能够隐藏起来。
        3.匿名内部类可以很方便的定义回调。
        4.使用内部类可以非常方便的编写事件驱动程序
内部类的访问特点:
        内部类可以直接访问外部类的成员,包括私有
        外部类要访问内部类的成员,必须创建对象
成员内内部类
成员内部类:定义在类中方法外的类。
    格式:
        public Class OutClassName{
            Class InnerClassName{
            //,,,

            }
            //,,,
        }
    如:汽车事务和引擎事物 引擎在汽车事物的内部
        public class Car{//car就是内部类
            class Engin{//engin就是内部类
            //,,,

            }
            //成员方法 move
            public void move(){
            System.out.printin("汽车在行走!");
            }
        }
创建内部类对象的格式:
        外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

示例代码:


    /* * 
     *定义一个外部类身体 body
     */
    public class Body {
            //定义身体是否还在或者  私有的
            private boolean islive = true;//ture代表活着

    //定义一个内部类 Heart
    public class Heart {

        //定义一个心脏跳动功能
        public void beating() {
            if (islive) {
                System.out.println("心脏在跳动");
            } else {
                System.out.println("心脏不跳动了");
            }
        }
    }

    //提供get set 方法
    public boolean isIslive() {
        return islive;
    }

    public void setIslive(boolean islive) {
        this.islive = islive;
    }
}
//测试
 public static void main(String[] args) {
                    //创建外部类   不能直接创建外部类
        Body body = new Body();
        //创建内部类对象
        // 格式:外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
        Body.Heart heart = body.new Heart();

        //调用内部类方法 jump() 心脏跳动
        heart.beating();
        //调用外部类方法
        body.setIslive(false);//isLive=false;
        //调用内部类方法
        heart.beating();//此时isLive
    }

运行结果:

心脏在跳动
心脏不跳动了
备注:内部类仍然是一个独立的类,在编译之后内部类会编译成独立的.class文件
             但是.class文件名称时:外部类名$内部类名
             如: Body$Heart.csass

匿名内部类

        匿名内部类:是内部类的简化写法,它的本质是一个
    《具体实现的》《父类或者父接口》《匿名》子类的对象。
    在开发中,最常用的内部类就是匿名内部类。
示例:
    以接口举例:当你使用一个接口的时候,你需要做如下操作:
    ·1定义子类。
    ·2重写接口中的方法。
    ·3创建子类对象。
    ·4调用重写后的方法。
我们的目的就是想调用接口中的某个方法,以上四部可以简化成一布操作
前提:
        匿名内部类必须时继承一个父类或者实现一个父接口。
格式:
        《类名不需要》
        new 父类名或者父接口(){
                //伴随着方法的重写
                @overrode
                public void method(){
                        //方法内容
                }
        }.method();
匿名内部类的本质
        本质:是一个继承了该类或者实现了该接口的子类匿名对象

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

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

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

ForegroundService没有从片段开始?

在内部片段类中使用ListView

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

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