内部类怎么用

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(使用前将#替换为@)

内部类怎么用 的相关文章

  • 数据结构有哪些

    概念 数据结构 数据用什么样的方式组合在一起 数据结构是计算机存储数据的方式 指相互之间存在一种或多种特定关系的数据元素集合 常见数据结构 数据存储的常用结构有 栈 队列 数组 链表和红黑树 栈 stack 又称堆栈 它是运算受限的线性表
  • [JavaSE]变量与类型

    来到新的篇章 最近开始从C语言的学习跳转到JAVA了 以后大概都是更新java的篇章 本文章我们讲述java中的变量与类型 目录 1 整型变量 2 长整型变量 3 双精度浮点型变量 4 单精度浮点型变量 5 字符类型变量 6 字节类型变量
  • 关于Java集合的一些技巧

    需要唯一吗 需要 Set 需要指定顺序吗 需要 TreeSet 不需要 HashSet 但是想要一个和存储一致的顺序 有序 LinkedHashSet 不需要 List 需要频繁增删吗 需要 LinkedList 不需要 ArrayList
  • 【javaSE】 反射与反射的使用

    文章目录 反射的定义 反射的用途 反射基本信息 反射相关的类 Class类 反射机制的起源 Class类中的相关方法 反射示例 获得Class对象的三种方式 反射的使用 反射优点和缺点 反射重点总结 总结 反射的定义 Java的反射 ref
  • jquery循环语句if-else if-else

    jquery循环语句if else if else callbackFun 函数 开始是写的if if else 结果是不管第一个if有没有匹配到 会再次判断 如果匹配到第二个if 则第二个if中的语句执行 没有匹配到第二个if 则else
  • Java中的String的一些常用方法

    家人们好 目录 字符 字节与字符串 字符与字符串 获取指定位置的字符 字符串与字符数组的转换 给定字符串一个字符串 判断其是否全部由数字所组成 字节与字符串 实现字符串与字节数组的转换处理 字符串常见操作 字符串比较 不区分大小写比较 观察
  • 判断考生成绩等级(switch case语句练习)

    判断考生成绩等级 1 考生成绩控制在 0 100 2 成绩 90 100 优 成绩 80 90 良 成绩 70 80 可 成绩 60 70 一般 成绩 0 60 不及格 要求使用switch语句 不能使用if语句 class SwitchT
  • Java中if-else的使用

    Java条件语句 if else 一个if语句包含一个布尔表达式和一条或多条语句 单if语句 语法 if语句的语法如下 if 布尔表达式 如果布尔表达式为true将执行此语句 如果布尔表达式的值为true 则执行if语句中的代码块 否则执行
  • Java--Map和HashMap基础

    一 Map常用方法 1 Map集合在 java util Map 包下 Map集合以键值对 key和value 的方式存储数据 key和value都是引用数据类型 都是存储对象的内存地址 2 Map接口中常用方法 V put K key V
  • Java String总结

    文章目录 创建String 字符串比较 字符串常量池 直接赋值 构造方法 理解字符串不可变 反射 特殊手段 char 和String StringBuffer和StringBuilder String API 创建String 常见的构造方
  • Java中ASCII码与字符之间的相互转换

    ASCII码转字符 char word char 97 强制转换 字符转ASCII码 int value a 加
  • Java文件的读写

    文件与流 在实际生活中 我们总要对文件进行操作 Java提供了流可以帮助我们读写文件 下面是常用的流类型结构图 在对文件的读写操作中 字节流可用于读写二进制文件 字符流用于读写文本文件 所谓二进制文件 指文件无字符编码格式 均由字节 Byt
  • TCP通信发送和接收数据(Socket、ServerSocket)、TCP通信案例

    目录 TCP TCP发送接收数据 发送数据 Socket 接收数据 ServerSocket TCP通信案例1 TCP接收数据后给出反馈案例2 TCP接收数据后给出反馈案例3 TCP接收数据后给出反馈案例4 TCP 概述 TCP通信协议是一
  • 【Java编程】图书管理系统

    图书管理系统 我们用一个列表存放书籍信息 private static List
  • Java的反射技术(Class类,Constructor类,Method类, Field类)

    Java编码时知道类和对象的具体信息 此时直接对类和对象进行操作即可 无需反射 如果编码时不知道类或者对象的具体信息 此时应该使用反射来实现 为什么要使用反射 反射就是把Java类中的各种成分映射成一个个的java对象 例如 一个类有 成员
  • Java概述

    Java 简介 一个苦逼的建筑专业的Java小白 什么是 Java Java 是一门面向对象编程语言 不仅吸收了 C 语言的各种优点 还摒弃了 C 里难以理解的多继承 指针等概念 因此 Java 语言具有功能强大和简单易用两个特征 Java
  • Java中对象比较的三种方式

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

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore
  • 【Java编程】关于Java的几个基础问题

    关于Java的几个基础问题 String 和 StringBuffer 和 StringBuilder 的异同 相同点 三者在 Java 中都是用来处理字符串的 三个类都被 final 修饰 因此都是不可继承的 StringBuilder
  • 求一个数组的最大值最小值及其下标

    求一个数组的最大值最小值及其下标 思路 假定一个数为最大值 如果有个数比假定的最大值还大 那么该数就为最大值 最小值同理 使用for循环 public class MaxMin public static void main String

随机推荐

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

    两台云服务器镜像 内容精选 换一换 请您在购买前确保已完成注册和充值 详细操作请参见如何注册公有云管理控制台的用户 登录管理控制台 单击管理控制台左上角的 选择区域和项目 选择 计算 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 内部类的访问特点 内部类可以直接访问外部类的成员