java内部类

Posted JunMain

tags:

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

什么是内部类

在一个类的内部在定义一个类

用法

例如我们定义一个People类

package com.test;

public class People {
    public void speak(){
        System.out.println("I'm People");
    }

    class teacher{
        private   String s = "I'm a teacher";

        public void speak(){
            System.out.println(s);
        }

    }
}

怎么用?

people.new 内部类() 来创建内部类

package com.test;

import org.junit.Test;

public class test01 {

    //测试内部类
    @Test
    public void test(){
        People people = new People();
        people.speak();
        people.new teacher().speak();
    }
}

内部类的作用?

  1. 内部类方法可以访问该类定义在作用域内的所有数据,包括private修饰的

  2. 内部类可以对同一个包的其他类隐藏起来

  3. 内部类可以解决java单继承的缺陷

  4. 当我们想定义一个回调函数却又不想写大量代码的时候,可以写匿名内部类

内部类可以对同一个包的其他类隐藏起来

有这么一个例子,当有接口需要去实现,我们又不想让其他类知道怎么实现这个接口,

我们就可以使用内部类。然后进行向上转型 让接口类型只想 实现类型,这样实现类就可以实现保密了

ISon接口

package com.test;

public interface ISon {
    public void speak();

    public void eat();
}

Father类

package com.test;

public class Father {
    public void say(){
        System.out.println("I'm father");
    }

    private class Son implements ISon{
        @Override
        public void eat(){
            System.out.println("我在吃饭");
        }

        @Override
        public void speak(){
            System.out.println("父慈子孝");
        }
    }

    public Son getSon(){
        return new Son();
    }

}

  //测试内部类作用
    @Test
    public void test01(){
        Father father = new Father();
        father.say();

         ISon son = father.getSon();
         son.eat();
         son.speak();
    }

如上述的例子,我们把ISon实现类的实现类放入Father类的内部,并把它设置为private,然后通过一个封装方法getSon()来获取

Ison的实现类,并且由于Son不能被其他类访问,所以我们利用ISon只想ISon的实现类,进行向上转型

内部类可以解决java单继承的缺陷

众所周知,java只能单继承一个类,而我们通常要实现多继承的时候,是用过接口实现的,但是接口有一个地方比较麻烦,就是

要实现接口接口中的所有方法,有的时候会觉得有一点繁琐,而内部类就可以实现再java之中的“多继承”

Example1

package com.test;

public class Example1 {
    public void name(){
        System.out.println("我是Example1");
    }
}

Example2

package com.test;

public class Example2 {
    public void name(){
        System.out.println("我是Example2");
    }
}

MultiExtend

package com.test;

public class MultiExtend {

    class One extends Example1{

    }

    class Two extends Example2{

    }
}

测试

 //测试内部类作用 多继承
    @Test
    public void test02(){
        MultiExtend multiExtend = new MultiExtend();
        multiExtend.new One().name();
        multiExtend.new Two().name();
    }

如上所述,我们在MultiExtend类之中有两个内部类,分别继承了Example1和Example2,这样MultiExtend间接的多继承了Exa2ple1

和Example2

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

# Java 常用代码片段

# Java 常用代码片段

elasticsearch代码片段,及工具类SearchEsUtil.java

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

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

ForegroundService没有从片段开始?