内部类学习

内部类学习

一、内部类

1.1简介

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

1.2目的

采用内部类这种技术,可以隐藏细节和内部结构,封装性更好,让程序的结构更加合理。

为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变 得完整,(内部类的存在使得Java的多继承机制变得更加完善。)

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码

1.3种类

1.成员内部类

内部类像是外部类的一个成员,并且成员内部类可以访问外部类的所有成员变量和成员方法(包括private成员和静态成员)

当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

/**
 * @Author: 郜宇博
 * @Date: 2021/8/28 21:50
 */
public class InnerClass {
    private String outerName;
    public InnerClass(){
        outerName = "outerName";
    }
    /**
     * 成员内部类
     */
    public class InnerClassCreate{
        private String innerName;

        public InnerClassCreate() {
            innerName = "innerClass";
        }
        public void display(){
            System.out.println("InnerClass create");
            System.out.println(innerName);
            System.out.println(outerName);
        }
    }

    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        //使用外部类的对象创建内部类
        InnerClass.InnerClassCreate innerClassCreate = innerClass.new InnerClassCreate();
        innerClassCreate.display();

    }
}

2.局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

/**
 * @Author: 郜宇博
 * @Date: 2021/8/28 21:50
 */
public class InnerClass {
    private String outerName;
    public InnerClass(){
        outerName = "outerName";
    }
    public void display(){
        class InnerClassCreate {
            private String innerName;

            public InnerClassCreate() {
                innerName = "innerName";
            }
            public void display(){
                System.out.println(innerName);
            }
        }
        InnerClassCreate innerClassCreate = new InnerClassCreate();
        innerClassCreate.display();
    }
    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        innerClass.display();

    }
}

3.匿名内部类

匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。

实现接口时,可以在使用其他文件编写实现类,也可以在同一文件编写内部类,还可以使用匿名内部类

/**
 * MyInterfece接口
 */
public interface MyInterfece {
    public void test();
}

方法一:

public class MyImplementOne implements MyInterfece{
    @Override
    public void test() {
        System.out.println("在另外文件编写实现类--》实现接口");
    }

    public static void main(String[] args) {
        //方法一:使用外部文件编写实现类
        MyInterfece myImplementOne = new MyImplementOne();
        myImplementOne.test();
        
    }
}

方法二:

/**
 * MyInterfece接口
 *	内部类实现接口
 */
public interface MyInterfece {
    public void test();
    public class MyImplementTwo implements MyInterfece{
        @Override
        public void test() {
            System.out.println("采用内部类实现接口");
        }
    }

    public static void main(String[] args) {
        MyInterfece myImplementTwo = new MyImplementTwo();
        myImplementTwo.test();

    }
}

方法三:

/**
 *匿名内部类实现接口
*/
public static void main(String[] args) {
    //方法三:匿名内部类
    MyInterfece myImplementThird = new MyInterfece() {
        @Override
        public void test() {
            System.out.println("匿名内部类实现接口");
        }
    };
    myImplementThird.test();

}

4.静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。

静态内部类是不需要依赖于外部类的(可以直接new),这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。

/**
 * @Author: 郜宇博
 * @Date: 2021/8/28 21:50
 */
public class InnerClass {
    private static String outerName;
    public InnerClass(){
        outerName = "outerName";
    }
    //静态内部类
    public static class StaticInnerClass{
        private String innerName;
        public StaticInnerClass(){
            innerName = "innerName";
        }
        public void display(){
            System.out.println(innerName);
            System.out.println(outerName);
        }

    }

    public static void main(String[] args) {
        InnerClass.StaticInnerClass staticInnerClass = new StaticInnerClass();
        staticInnerClass.display();

    }
}
//输出:innerName
//		null
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115177.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • goland在线激活-激活码分享[通俗易懂]

    (goland在线激活)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • JAVA乐观锁_spring的线程池配置

    JAVA乐观锁_spring的线程池配置首先介绍一些乐观锁与悲观锁:悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很

  • hashmap的底层实现原理_hashtable底层数据结构

    hashmap的底层实现原理_hashtable底层数据结构一:HashMap底层实现原理解析我们常见的有数据结构有三种结构:1、数组结构2、链表结构3、哈希表结构下面我们来看看各自的数据结构的特点:1、数组结构:存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。2、链表结构:存储区间离散、占用内存宽松、空间复杂度小优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活

  • 嵌入式语音识别智能家居笔记1

    嵌入式语音识别智能家居笔记11.环境VMware15.5Ubuntu18.04Qt安装包2.共享目录设置VMware->虚拟机->设置->选项->共享文件夹3.QT的linux安装包:qt-opensource-linux-x64-5.9.1.run复制到共享目录打开终端:cd/mnt/hgfs/sharesudo./qt-opensource-linux-x64-5.9.1.run4.直接搭服务器失败(1)sudodate-s2016-…

  • 五个最佳FTP客户端工具「建议收藏」

    五个最佳FTP客户端工具「建议收藏」概述无论你是做网站工作,还是运行一个家庭FTP服务器,或者你只是喜欢高速下载,一个稳定且功能齐全的FTP客户端工具都可以节省你大量时间和生命,现在有大量的免费或者收费的FTP客户端软件供大家选择,这里总结了五个流行的FTP客户端软件。FileZilla(所有平台)FileZillaFileZilla是一个免费开源的适合Windows、Mac和Linux的FTP客户端软件,因为其实免费跨平台和易用性,因此它是很多FTP用户的最初选择,FileZilla下载速度非常快,功能齐全,如果你是Wind

  • 全国计算机考试python 培训

    全国计算机考试python 培训很多同学想考python的证书,想知道Python有哪些含金量高的证书?一、全国计算机等级考试Python程序语言设计;二、PythonInstitute资格认证初级PCEP;三、PythonInstitute资格认证初级PCEP中级PCAP;四、PythonInstitute资格认证初级PCEP高级PCPP;五、工信部Python技术应用工程师专项技术证书;六、百度技术认证深度学习工程师。现在比较热门的有全国计算机等级考试Python程序语言设计、工信部Python技术应用工程师专项技术证书、百度技

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号