局部内部类、匿名内部类、私有内部类

有关于内部类的讲解,见此篇java内部类的创建
下面分别将讲解局部内部类、匿名内部类、私有内部类。

1. 局部内部类

可以在方法中定义内部类,甚至在语句块中也可以定义内部类,
这种情况通常是某个方法需要创建一个类来辅助完成该方法的功能,而这个类只用在该方法中。
局部内部类需要配合接口来一起使用。

interface Speaker {
    void speak();
}

class LocalInnerClass {

    Speaker getSpeaker(String str) {
        class MySpeaker implements Speaker {
            @Override
            public void speak() {
                System.out.println(str);
            }
        }

        return new MySpeaker();
    }
}

public class App {
    public static void main(String[] args) {
        LocalInnerClass li = new LocalInnerClass();
        li.getSpeaker("good").speak();
    }
}

局部内部类限定了该类只能在局部作用域内被访问,因此是无法直接返回该类型的对象的,需要向上转型为其实现的接口类型。因此,局部内部类不能使用public和private进行声明。

2. 匿名内部类

Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。
主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。
匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
匿名类语法格式:

class outerClass {

        // 定义一个匿名类
        object = new Type(parameterList) {
             // 匿名类代码
        };
    }

以上的代码创建了一个匿名类对象 object,匿名类是表达式形式定义的,所以末尾以分号;来结束
匿名类通常继承一个父类或实现一个接口。一旦掌握了匿名的内部类,可以让你的代码更加简洁清晰,匿名内部类一定是一个实现某个接口或者继承某个类的类,所以我们必须在使用匿名内部类之前定义一个接口或类。

/* 1. 匿名类继承一个父类 */
class Polygon {
    public void display() {
        System.out.println("在 Polygon 类内部");
    }
}
class AnonymousClass {
    public void createClass() {

        // 创建匿名类并继承Polygon类
        Polygon p1 = new Polygon() {
            @Override
            public void display() {
                System.out.println("我是匿名类,继承自Polygon类。");
            }
        };

        p1.display();
    }
}

/* 2. 匿名类实现一个接口 */
interface Student {
    void show();
}
interface Singer {
    void sing();
}

class AnonymousClassDemo {

    public void createClass() {
        // 创建匿名类并实现一个接口
        Student su = new Student() {
            @Override
            public void show() {
                System.out.println("我是匿名类,实现了Student接口。");
            }
        };
        su.show();
    }

    public Singer getSinger() {
        return new Singer() {
            @Override
            public void sing() {
                System.out.println("我是匿名类,实现了Singer接口。");
            }
        };
    }

}

class App {
    public static void main(String[] args) {
        AnonymousClass demo1 = new AnonymousClass();
        demo1.createClass();

        AnonymousClassDemo demo2 = new AnonymousClassDemo();
        demo2.createClass();
        demo2.getSinger().sing();
    }
}

3. 私有内部类

内部类可以使用 private 或 protected 来修饰,如果你不希望内部类被外部类访问可以使用 private 修饰符。

class PrOuterClass {
    int num1 = 10;

    private class PrInnerClass {
        int num2= 20;
    }
}
 // 企图在外部创建私有类,错误
 PrOuterClass pOuter = new PrOuterClass();
 PrOuterClass.PrInnerClass pInner = pOuter.new PrInnerClass();     // error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/12927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】System V IPC-命名管道共享内存消息队列

System V IPC-命名管道&共享内存&消息队列 命名管道共享内存创建共享内存附加和分离共享内存 消息队列消息队列的接口 命名管道 使用mkfifo命令,创建一个命名管道,通过ll可以查看当前命名管道的类型 p类型,也就是pipe管道类型。 之…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能,不过终究感觉有点简陋,最近也在搞PyQT5,发现如果对于这块了解不多的情况下,想要做一些东西的话,简直无从下手,因此专门翻阅了之前的文章,查看了下确实缺少了…

json for modern c++

目录 json for modern c概述编译问题问题描述问题解决 读取JSON文件demo json for modern c GitHub - nlohmann/json: JSON for Modern C 概述 json for modern c是一个德国大牛nlohmann写的,该版本的json有以下特点: 1.直观的语法。 2.整个代码由一个…

机器学习——L1范数充当正则项,让模型获得稀疏解,解决过拟合问题

问:使用L2范数正则项比L1范数正则项得到的是更为稀疏的解。 答:错误,L1范数正则项得到的是更稀疏的解。因为在L1正则项中,惩罚项是每个参数绝对值之和;而在L2正则项中,惩罚项是每个参数平方的和。L1正则项…

( “树” 之 DFS) 111. 二叉树的最小深度 ——【Leetcode每日一题】

111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2…

Nginx 正向代理、方向代理、端口转发

正向代理就是客户端代理,代理客户端,服务端不知道实际发起请求的客户端 正向代理中,proxy和client一般同一个lan或者网络可达,server与client一般不可达(缓存场景除外) 正向代理类似一个跳板机&#xff0c…

java异常

下面是算术异常。 抛出的异常其实是个类。 下面是空指针异常。 用异常时,下面语句不会执行。 上面这些是运行时异常 下面这是编译时异常。 在程序编译期间发生的异常,称为编译时异常,也称为受检查异常 在程序执行期间发生的异常,…

企业信息化建设该怎么做?方向和手段都在这了

企业信息化建设该怎么做? 如果现在是十年前,我一定会说,做信息化需要寻找熟悉不同编程语言、有经验的程序员。 但是现在,如果不是特别复杂的信息化系统,其实公司完全可以使用零代码平台自主开发,不需要再…

TryHackMe-Year of the Jellyfish(linux渗透测试)

Year of the Jellyfish 请注意 - 此框使用公共 IP 进行部署。想想这对你应该如何应对这一挑战意味着什么。如果您高速枚举公共 IP 地址,ISP 通常会不满意… 端口扫描 循例nmap 扫描结果中还有域名,加进hosts FTP 枚举 尝试anonymous Web枚举 有三个端…

Open Inventor 2023.1 Crack

发行说明 Open Inventor 2023.1(次要版本) 文档于 2023 年 4 月发布。 此版本中包含的增强功能和新功能: Open Inventor 10 版本编号更改体积可视化 单一分辨率的体绘制着色器中与裁剪和 ROI 相关的新功能MeshVizXLM 在 C 中扩展的剪辑线提…

[网络安全]第三次作业

目录 1. 什么是IDS? 2. IDS和防火墙有什么不同? 3. IDS工作原理? 4. IDS的主要检测方法有哪些详细说明? 5. IDS的部署方式有哪些? 6. IDS的签名是什么意思?签名过滤器有什么作用?例外签名…

SpringBootApplication最详细注解

SpringBootApplication最详细注解 SpringBootApplication的注解分类1.Target 2.Retention3.Document 4.Inherited5.SpringBootConfiguration 6.EnableAutoConfiguration6.1AutoConfigurationPackage这个注解6.1.1 Import6.1.2 AutoConfigurationpackages.Registrar.class 6.2 A…

经营软件公司五年,从外包到SaaS的踩坑笔记

文章目录 摘要开公司的两个误区关于管理关于合作关于SaaS其他经验大和强是两码事。大不是目的,强才是。小步试错、慢慢迭代不要掉入流量陷阱 摘要 经营公司已有五年,经历了三年的疫情停滞,现在正在转型为一家SaaS公司。虽然曾经迷茫过&#…

【虹科案例】固态量子发射器——虹科数字化仪用于控制钻石色心中的脉冲序列

前言 钻石的色心是晶格中的缺陷,其中碳原子被不同种类的原子取代,相邻的晶格位置是空的。由于其明亮的单光子发射和光学可访问的自旋,色心可以成为未来量子信息处理和量子网络的有前途的固态量子发射器。 实现自旋量子比特和相干光子纠缠的两…

Linux DHCP服务

DHCP 作用 DHCP动态主机配置协议作为服务端负责集中给客户端分配各种网络地址参数(主要包括IP地址、子网掩码、广播地址、默认网关地址、DNS服务器地址) 传输协议端口 服务端 UDP 67端口 客户端 UDP 68端口 工作原理 1) 客户端广播发送DISCOVER报文寻找服务端 2) 服务端广播发…

5G物理层信道pdcch说明(留档)

网络七层协议OSI是一个开放性的通信系统互连参考模型。 它是国际标准组织制定的一个指导信息互联、互通和写作的网络规范。 开放:是指只要遵循OSI标准,位于世界的任何地方的任何系统之间都可以进行通讯;开放系统:是指遵循互联网协…

MBD—模型的回调函数

目录 前面 如何设置? 应用 简单的提示 数据的初始化 前面 常用的回调函数有三类:模型的回调函数、模块的回调函数、信号的回调函数。这里分享一下模型的回调函数。 回调函数就是CallBack. 如何设置? 打开一个模型,在空白…

论文阅读【17】Dynamic ensemble learning for multi-label classification

论文十问十答: Q1论文试图解决什么问题? Q2这是否是一个新的问题? Q3这篇文章要验证一个什么科学假设? Q4有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? Q5论文中提到的解决方…

简述API(电商数据API)网关的概念和功能

API 网关 ( API gateway ) 前言 在 IOT ( 物联网 )中,当我们的一些设备。例如( 监控、传感器等 )需要将收集到的数据和信息进行汇总时,我们就需要一个 API。(如果你需要Taobao/JD/pinduoduo平台…

Replicator简介

Replicator 文章目录 ReplicatorReplicator简介合成数据训练背后的理论Replicator核心组件已知的问题 Replicator简介 Omniverse Replicator 是一个高度可扩展的框架,构建在可扩展的 Omniverse 平台上,可生成物理上准确的 3D 合成数据,以加速…