内部类怎么用

2023-10-29

内部类:

在一个类中定义一个类。
举例:在一个类A的内部定义一个类B,类B就被称为内部类

    // 格式: class 外部类名{ 修饰符 class 内部类名{ } } 
    class  A{
        public class B {
        }
    }

内部类的访问特点:

内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象

   public class Outer {
        private int num = 10;

        private class Inner {
            public void show() {
                System.out.println(num);
            }
        }

        public void method() {
        // 创建内部类对象
            Inner i = new Inner();
            i.show();
        }
    }

成员内部类:

成员内部类的定义位置:

在类中方法,跟成员变量是一个位置

成员内部类的使用:

1.创建外部类对象
2.根据外部类对象创建内部类对象

成员内部类的好处:

可以直接使用外部类的成员,包括私有
成员内部类的定义位置

外界创建成员内部类格式:

格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
举例:Outer.Inner oi = new Outer().new Inner();

私有成员内部类:

将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。

    class Outer {
        private int num = 10;
        private class Inner {// 使用private修饰内部类,外部是访问不到的
            public void show() {
                System.out.println(num);
            }
        }
        public void method() {
            Inner i = new Inner();
            i.show();
        }
    }
    
    public class InnerDemo {
        public static void main(String[] args) {
    		//Outer.Inner oi = new Outer().new Inner(); 内部类被private修饰后不能直接访问,这里会报错
            Outer o = new Outer();
            o.method();
        }
    }

静态成员内部类

  • 由static修饰的成员内部类
  • 静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
  • 静态成员内部类中的静态方法:外部类名.内部类名.方法名();

静态内部类只能使用外部类的?

只能使用外部类static修饰的成员变量和成成员方法
静态内部类可以直接访问外部类的静态成员。

代码演示:

    class Outer {
        static class Inner {
            public void show(){
                System.out.println("inner..show");
            }

            public static void method(){
                System.out.println("inner..method");
            }
        }
    }

    public class Demo {
        public static void main(String[] args) {
            Outer.Inner oi = new Outer.Inner();
            oi.show();

            Outer.Inner.method();
        }
    }
局部内部类:

什么是局部内部类:

局部顾名思义就是,定义在方法中的类

局部内部类的使用:

在定义局部内部类的下面马上使用

局部内部类的好处:

可以直接使用外部类的成员

public class Demo02 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.method();
    }
}


class Outer {
    public void method() {

        class Inner {
            public void show(){
                System.out.println("show方法执行");
            }
        }

        Inner inner = new Inner();
        inner.show();
    }
}
匿名内部类:

什么是匿名内部类:

没有名字的内部类,本质是一个继承了该类或者实现了该接口的子类匿名对象

内部类的前提:

存在一个类或者接口,这里的类可以是具体类也可以是抽象类

匿名内部类的格式:

new 接口或者类() {
    重写方法;
}.方法名();

匿名内部类的好处:

可以简化接口的使用,代码更少(不需要有实现类)

匿名内部类的缺点:

匿名内部类没有名字,只能使用一次

匿名内部类调用注意:

匿名内部类可以通过多态的形式接收,例如,接口A中有两个抽象方法,就可以通过多态形式接收

匿名内部类做了什么:

  • 匿名内部类把继承/实现、方法重写、创建对象放在一步去操作

代码演示:

    interface Inter {
        void method();
        void method2();
    }

	// 只调用一个方法
    class Test {
        public static void main(String[] args) {
        
            new Inter() {
                @Override
                public void method() {
                    System.out.println("我是匿名内部类");
                }
            }.method();
        }

	// 需要调用多个方法时可以通过多态接收,再调用
     Inter i = new Inter() {
                @Override
                public void method() {
                    System.out.println("method");
                }
                
  				@Override
                public void method2() {
                    System.out.println("method2");
                }
            };
            i.method();
            i.method2();
        }
    }

匿名内部类开发场景

当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码

   interface Swimming {
        void swim();
    }

    public class TestSwimming {
        public static void main(String[] args) {
            goSwimming(new Swimming() {
                @Override
                public void swim() {
                    System.out.println("铁汁, 我们去游泳吧");
                }
            });
        }

        public static void goSwimming(Swimming swimming) {
            swimming.swim();
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内部类怎么用 的相关文章

  • Java中参数的传递机制,究竟是值传递还是引用传递?

    先说结论 Java语言中 本质上只有值传递 没有引用传递 废话不说 咱们直接来看例子 public class Demo public static void main String args int i 10 testInt i Syst
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • Java中if-else的使用

    Java条件语句 if else 一个if语句包含一个布尔表达式和一条或多条语句 单if语句 语法 if语句的语法如下 if 布尔表达式 如果布尔表达式为true将执行此语句 如果布尔表达式的值为true 则执行if语句中的代码块 否则执行
  • 值传递与引用传递的区别

    一 值传递 是指在调用函数时将实际参数复制一份传递到函数中 这样在函数中如果对参数进行修改 将不会影响到实际参数 代码在内存中的执行流程 1 首先加载main方法 2 接下来int number 100 3 输出调用前的number 结果为
  • Java文件的读写

    文件与流 在实际生活中 我们总要对文件进行操作 Java提供了流可以帮助我们读写文件 下面是常用的流类型结构图 在对文件的读写操作中 字节流可用于读写二进制文件 字符流用于读写文本文件 所谓二进制文件 指文件无字符编码格式 均由字节 Byt
  • Java 解析http返回的xml数据

    Java 解析http返回的xml数据 写成txt文件 需求 每小时抓取给定api接口返回的xml数据 把xml数据保存为XML文件 把xml数据转换txt文件格式数据 保存txt文件 文件名以yyyyMMddHH0000 txt和yyyy
  • 【Java编程】图书管理系统

    图书管理系统 我们用一个列表存放书籍信息 private static List
  • java中的异常

    异常 什么是异常 运行时异常和编译时异常 编译时异常 运行时异常 异常处理及其语法 异常的产生及处理 try catch语句 finally语句 抛出异常 throws关键字 throw关键字 自定义异常类 什么是异常 java中的异常是指
  • Scanner中nextInt()和nextLine()详解(秒懂)

    直接上代码 输出结果 结果分析 nextInt 和nextLine 顺序互换代码如下 输出结果 结果分析 解决方法 可以将nextLine 用next 替换 两者nextLine 执行之前再加一个空nextLine 让这个空的清楚掉回车符再
  • XML语言

    XML XML是可扩展的标记语言 标记语言 通过标签来描述数据的一门语言 标签有时我们也将其称之为元素 可扩展 标签的名字是可以自定义的 XML文件是由很多标签组成的 而标签名是可以自定义的 xml学习网站https www w3schoo
  • DateFormat setLenient

    SimpleDateFormat df new SimpleDateFormat MMddyyyy With lenient parsing the parser may use heuristics to interpret inputs
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性
  • Kotlin内部类

    一 内部类 定义在类内部的类 与类成员有相似的访问控制 kotlin 默认是静态内部类 非静态用inner关键字 this outter this inner的用法 二 匿名内部类 没有定义名字的内部类 类名编译时生产 类似Outter 1
  • 包装类自动装箱和拆箱原理

    包装类的自动装箱和自动拆箱 包装类的自动装箱和拆箱是JDK1 5的新特性 一 首先 了解自动装箱的过程 有两种自动装箱过程 第一种 128 127 之内 调用相应包装类的valueOf 例如 Integer i 12 Integer a 2
  • Java中对象比较的三种方式

    一 针对对象值是否相等的比较 和 equals 的区别 当我们提到比较值的时候 大多数人都会想到 因为在一般情况下 人们对于比较的概念中 数字比较的应用场景出现频率是最多的 首先我们创建一个类 之后新建这个类的对象来进行比较验证 class
  • java虚拟机+分隔符

    java 入门 java 虚拟机 1 java虚拟机的平台可移植性 只要将java虚拟机安装于不同平台 我们编译的 class 文件就可以运行 2 jdk java开发 3 jre java运行时环境 jdk jre 下载安装后必须在环境变
  • System.out.println()影响系统运行效率!!!

    在Java开发中 System out println 是一种常用的输出方式 可以将字符串输出到控制台 然而 这种输出方式在一定程度上会影响系统的运行效率 首先 System out println 的输出操作需要占用CPU和内存资源 因为
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore
  • java I/0操作 FileWriter类

    package filewriter p1 import java io FileWriter import java io IOException public class FileWriterDemo 获取当前系统的换行符 获取指定键指
  • java 使用匿名内部类的方式创建线程并设置和获取线程名字

    有些方法需要传入接口的实例或者抽象类的实例对象 比如Thread有一个构造方法 Thread Runnable target 这时可以可以自定义类实现Runnable接口 重写接口中的方法 将自定义类的对象传入构造方法中 也可以使用匿名内部

随机推荐

  • 两台服务器文件镜像,两台云服务器镜像

    两台云服务器镜像 内容精选 换一换 请您在购买前确保已完成注册和充值 详细操作请参见如何注册公有云管理控制台的用户 登录管理控制台 单击管理控制台左上角的 选择区域和项目 选择 计算 gt 弹性云服务器 单击 购买弹性云服务器 系统进入购买
  • 删除单链表中的指定节点

    题目1 编写在带头结点的单链表L中删除一个最小值结点的高效算法 假设最小值结点是唯一的 时间复杂度为O n 空间复杂度为O 1 问题解答 算法思想 用p从头至尾扫描单链表 pre指向 p结点的前驱 用minp保存值最小的结点指针 初值为p
  • 那些方法可以绕过服务器对文件内容的检测,文件上传漏洞

    文件上传 文件上传就是在一些web应用中允许用户上传图片 文本等相应文件到服务器指定的位置 而文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中 之后通过url去访问以执行代码达到攻击的目的 可以成功攻击的条件 1 存放上传文件
  • Linux网络编程:IO多路复用——epoll

    服务器端代码 epoll event poll include
  • mysql sqlite 语法_浅谈sqlite与mysql的数据库语法差异_沃航科技

    由于一些原因 小沃将自己的官方网站从原来的阿里云迁移到了justg的vps上 服务器配置也从原理的1核1G变为了1核512M 虽然服务器性能所有下降 但是毕竟小沃的官网是使用了百度的cdn的 因此应付高并发还是没有什么问题的 考虑到服务器性
  • Go框架之Gin应用到原理源码

    Go框架之Gin应用到原理源码 基本概览 目前 golang使用最广泛的Web 微框架之一 具有高性能的优点 基于 httprouter 它提供了类似martini但更好性能 路由性能约快40倍 的API服务 本文将从基本应用快速上手到中间
  • C++中unique函数

    C 中unique函数 文章一 unique是STL中很实用的函数之一 需要 include 感谢各位提醒 下面来简单介绍一下它的作用 unique的作用是 去掉 容器中相邻元素的重复元素 这里去掉要加一个引号 为什么呢 是因为它实质上是一
  • Java面试题全集(下)

    这部分主要是开源Java EE框架方面的内容 包括hibernate MyBatis spring Spring MVC等 由于Struts 2已经是明日黄花 在这里就不讨论Struts 2的面试题 如果需要了解相关内容 可以参考我的另一篇
  • 封装高德地图定位组件

  • 回顾2019,展望2020

    同2018一年一样 2019年同样是充实的一年 回顾一下2019年 做出总结 不足的地方在未来的日子里改进 顺便展望2020年 给自己一个比较清晰的目标 2019年工作之外的时间基本都花在学习英语和编程相关的技术上 学习英语花费的时间多于学
  • 使用Git LFS上传大文件到GitHub教程,以及可能会遇到的坑(使用了Git LFS却依然传不上超过100M的文件;framework库如何添加等)

    什么是Git LFS Git LFS Large File Storage 是 Github 开发的一个 Git 的扩展 用于实现 Git 对大文件的支持 简单的说 就是如果你想传超过100M的二进制文件到GitHub 你就要用Git LF
  • obs上传文件到服务器,OBS服务应用于互联网数据上传时 使用POST 实现服务端和客户端权限控制和数据上传分离的方法...

    1背景 采用JavaScript SDK 等客户端直接签名时 AccessKeyID和AcessKeySecret会暴露在前端页面 因此存在严重的安全隐患 因此 OBS提供了服务端签名后直传的方案 解决此问题 问题代码如下所示 需要在前端使
  • 牛客——数字权重(组合数学)

    数字权重 题目描述 小a有一个n位的数字 但是它忘了各个位上的数是什么 现在请你来确定各个位上的数字 满足以下条件 设第 i i i位的数为 a i
  • 关于WEB 性能优化 (摘抄)

    压缩源代码和图片 JavaScript文件源代码可以采用混淆压缩的方式 CSS文件源代码进行普通压缩 JPG图片可以根据具体质量来压缩为50 到70 PNG可以使用一些开源压缩软件来压缩 比如24色变成8色 去掉一些PNG格式信息等 选择合
  • R语言:以多列标准筛选特定行

    作者 村长 数据科学 指弹吉他及录音工程爱好者 浙大金融学博士在读 在data table包和MongoDB的使用上有较多经验 写 在前面 本期我们大猫二人组的村长在新的一年首先回归 为大家带来新的推送 在本期 我们会运用一个病例数据为大家
  • avrdude: stk500v2_ReceiveMessage(): timeout, arduino mega2560 上传出错; arduino nano刷bootload后上传出错

    avrdude stk500v2 ReceiveMessage timeout 此方法适用于其他各型号Arduino 1 将C Program Files x86 Arduino hardware arduino avr boards tx
  • 牛客网SQL刷题二-某音短视频

    SQL1 各个视频的平均完播率 数据 DROP TABLE IF EXISTS tb user video log tb video info CREATE TABLE tb user video log id INT PRIMARY KE
  • C# to POST HTTP with XML

    HttpWebRequest request null WebResponse response null try string myURL https blah blah gov themagicform cfm The URL for
  • 机器学习初学者指南:机器学习黑客马拉松竞赛经验分享

    总览 本文是进入机器学习黑客马拉松竞赛的前10 的终极入门者指南 如果你遵循本文列出的这些简单步骤 那么赢得黑客马拉松的分类问题是比较简单的 始终保持不断的学习 以高度的一致性进行实验 并遵循你的直觉和你随着时间积累的领域知识 从几个月前在
  • 内部类怎么用

    内部类 在一个类中定义一个类 举例 在一个类A的内部定义一个类B 类B就被称为内部类 格式 class 外部类名 修饰符 class 内部类名 class A public class B 内部类的访问特点 内部类可以直接访问外部类的成员