Java内部类与匿名类

news2024/10/5 16:19:46

内部类

定义:

一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类

//外部类
class Outer
{
	//内部类
	class Inner
	{
	
	}
}
package Innerclass;

//外部其他类
public class c1 {
}

class Outer
{
    //属性
    private int n1 = 100;
    //方法
    public void m1()
    {
        System.out.println("m1()");
    }
    //内部类
    class Inner
    {
        
    }
}

内部类的分类

1、定义在外部类局部位置上(比如方法内)
(1)局部内部类(有类名)

(2)匿名内部类(没有类名)

2、定义在外部类的成员位置上
(1)成员内部类(没用static修饰)
(2)静态内部类(使用static修饰)

1、局部内部类

1、局部内部类是定义在外部类的方法中的
2、并且局部内部类可以访问外部类的所有成员包括私有的,访问的方法是直接访问,外部类在方法中可以创建内部类的对象,然后通过内部类的对象去调用其方法
3、不能添加访问修饰符,和局部变量一样,可以用final来修饰
4、作用域只在局部类的方法体内
5、外部其他类不能访问局部内部类(因为局部内部类的地位是一个局部变量)

package Innerclass;

public class LocalInnerClass {
    public static void main(String []args)
    {
        Outer02 outer02 = new Outer02();
        outer02.m1();
    }
}
//外部类
class Outer02
{
    //属性
    private int n1 = 100;
    //私有方法
    private void m2()
    {
        System.out.println("m2");
    }
    //方法
    public void m1()
    {
        //局部内部类通常定义在外部类的方法中
        //局部内部类
        class Inner02
        {
            //局部内部类可以访问外部类的所有成员,包含私有的
            public void f1()
            {
                m2();
                System.out.println("n1 = " + n1);
            }
        }
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }
}

6、如果外部类和内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用(外部类名.this.成员)

Out02.this.n2

匿名内部类

1、本质是类
2、内部类, 但实际是有名字的,只不过用完之后会立即被销毁
3、该类是没有名字
4、同时还是一个对象

匿名内部类创建之后,会立马实例化出来,然后这个匿名类内部类就不能再被使用了,但实例化出来的对象是可以反复调用的

基于接口的匿名内部类使用

package Innerclass;

public class AnonymousInnerClass {
    public static void main(String []args)
    {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}
class Outer04
{
    private int n1 = 10;
    public void method()
    {
        //基于接口的匿名内部类
        //tiger的编译类型?IA
        //tiger的运行类型?就是匿名内部类
        /*
            底层是
            class XXXX implements IA
            {
                public void cry()
                {
                    System.out.println("老虎叫唤...");
                }
            }
         */
        IA tiger = new IA()
        {
            public void cry()
            {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型 = " + tiger.getClass());
        tiger.cry();
    }
}

interface IA{
    public void cry();
}

image

基于类的匿名内部类

package Innerclass;

public class AnonymousInnerClass {
    public static void main(String []args)
    {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}
class Outer04
{
    private int n1 = 10;
    public void method()
    {
        //基于接口的匿名内部类
        //tiger的编译类型?IA
        //tiger的运行类型?就是匿名内部类
        /*
            底层是
            class XXXX implements IA
            {
                public void cry()
                {
                    System.out.println("老虎叫唤...");
                }
            }
         */
        IA tiger = new IA()
        {
            public void cry()
            {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型 = " + tiger.getClass());
        tiger.cry();

        //正常new一个对象
        Father father1 = new Father();
        System.out.println("father1对象的运行类型是=" + father1.getClass());

        //匿名内部类
        Father father = new Father()
        {
            @Override
            public void test() {
                System.out.println("匿名内部类重写了test方法");
            }
        };
        System.out.println("father对象的运行类型=" + father.getClass());
        father.test();
        Animal animal = new Animal()
        {
            @Override
            public void say() {
                System.out.println("小狗吃骨头");
            }
        };
        animal.say();
    }
}

interface IA{
    public void cry();
}

class Father
{
    public void test() {}
}

abstract class Animal
{
    public void say()
    {}
}

image

匿名内部类的使用细节

匿名内部类的定义比较特殊,本身是一个类同时还是一个对象

先定义一个匿名内部类,接收之后,再用生成的对象

image

不接收直接调用

image

package Innerclass;

public class AnonymousInnerClassDetail
{
    public static void main(String[] args)
    {
        Outer05 outer05 = new Outer05();
        outer05.f1();
    }
}

class Outer05
{
    private  int n1 = 99;
    public void f1()
    {
        Person person = new Person()
        {
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi");
            }
        };
        person.hi();

        //也可以直接调用
        new Person()
        {
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了hi");
            }
        }.hi();
    }

}
class Person
{
    public void hi()
    {
        System.out.println("Person hi");
    }

}

匿名内部类的实践

匿名内部类主要用于当前类只使用一次,使用过后我们就不会再反复使用,这样我们就没有必要专门再写一个类。

package Innerclass;

public class InnerClassExercise01 {
    public static void main(String[]args)
    {
       f1(new IL() {
           @Override
           public void show() {
               System.out.println("这是一幅名画");
           }
       });
    }
    public static void f1(IL il)
    {
        il.show();
    }
}
interface IL
{
    void show();
}
package Innerclass;

public class InnerClassExercise02 {
    public static void main(String[] args)
    {
        CellPhone cellPhone = new CellPhone();
        cellPhone.alarmclock(new Bell() {
            @Override
            public void ring() {
                System.out.println("懒猪起床了");
            }
        });
        cellPhone.alarmclock(new Bell() {
            @Override
            public void ring() {
                System.out.println("小伙伴们上课");
            }
        });
    }
}

interface Bell
{
    void ring();
}

class CellPhone{
    public void alarmclock(Bell bell)
    {
        bell.ring();
    }
}

成员内部类

1、成员内部类是定义在外部类的成员位置,并且没有static修饰。
2、成员内部类可以直接访问外部类的所有成员,包括私有成员。
3、外部类访问内部类,就是直接创建一个内部类然后通过类进行访问。
4、我们可以用public、private、protected去修饰,因为它本身就是一个成员

package Innerclass;

public class MemberInnerClass {
    public static void main(String [] args) {
        Outer08 outer08 = new Outer08();
        outer08.t1();
    }
}

class Outer08{
    private int n1 = 10;
    public String name = "张三";
    class Inner08{
        public void say()
        {
            System.out.println("n1 = " + n1 + " name = " + name);
        }
    }
    public void t1(){
        Inner08 inner08 = new Inner08();
        inner08.say();
    }
}

外部其他类使用成员内部类的两种方式
1、
image
2、
image

静态内部类

比上个内部类多了一个static修饰符
1、静态内部类,在外部类的成员位置,有static修饰
2、可以访问外部类的所有静态成员,非静态不能访问
3、作用域为整个类体

package Innerclass;

public class StaticInnerClass {
    public static void main(String[] args) {
        Outer10 outer10 = new Outer10();
        outer10.m1();
    }
}

//外部类
class Outer10{
    private int n1 = 10;
    private static String name = "张三";
    //静态内部类,在外部类的成员位置,有static修饰

    //可以访问外部类的所有静态成员,非静态不能访问
    //作用域为整个类体
    static class Inner10{
        public void say(){
            System.out.println(name);
        }
    }
    public void m1(){
        Inner10 inner10 = new Inner10();
        inner10.say();;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--线段树--洛谷模板线段树1-2

写在前面: 学习之前需要知道以下内容: 1. 递归 2. 二叉树 文章目录 线段树介绍用途建树修改单点修改区间修改 查询 代码实现。建树更新lazy传递查询优化一下 练习洛谷 P3372 【模板】线段树 1题目描述题解 【模板】线段树 2题目描述题解 线段树 介绍 …

生产流程图怎么制作?思路提供

生产流程图是一种图表,用来展示生产流程中的各个环节及其顺序。这种图表可以帮助企业管理者更好地了解生产过程中的各个环节,从而更好地进行管理和优化。生产流程图通常包括各个生产环节的名称、所需时间、参与人员、设备和工具等信息。 在制作生产流程图…

虚拟机 03 补充 redis的命令

Redis的操作命令: Redis的启动命令:redis-server redis.conf 进入redis的客户端操作命令:redis-cli -p 6379 退出redis客户端的操作命令:exit或者ctrlc 关闭redis的命令:redis-cli -p 6379 shutdown Redis数据操作命令…

免费优质的网页设计素材网站推荐

找到一个免费优质的网页设计素材网站并不容易。 有些网站要么需要网站的会员,要么设计素材质量差。本文整理总结了10个免费的网页设计材料网站,希望给大家带来一些帮助。 即时设计资源社区 即时设计资源社区是由在线协同设计软件即时设计推出的设计社…

2023乡村振兴三点:粮食安全,数字乡村,特色产业

2023乡村振兴三条:粮食安全,数字乡村,特色产业 人工智能总趋势在减少就业 乡村生活综合服务领域~ 可能是以后吸纳劳动力的重要领域 农业现代化最后在实现中… 趣讲大白话:人没事干,咋办 【趣讲信息科技168期…

基于 debian 发行版本的密码设置策略

密码过期时间设置 修改 /etc/login.defs 中的选项 PASS_MAX_DAYS 99999 代表不过期 我们将该值改为 90 密码复杂度设置 需要安装 pam 扩展包 libpam-pwquality 或 libpam-cracklib 。 这里选择安装 libpam-cracklib sudo apt updatesudo apt install libpam-cracklib查看…

虚拟机 03 redis安装和启动服务

redis在linux上的安装: 01.先找到redis的压缩文件 这里的是gz格式的。 02.在linux系统中,先去切换到根目录先 使用命令 cd / 再切换到usr/local/src中 直接把压缩文件拖入到linux系统的命令行中 src文件中会出现redis-5.0.4.tar.gz的文件 03.对这个文…

arm作业

用for循环实现1~100之间的和13BA for(i1;i<100;i) { sum sumi; }

面试7轮,结果对接的HR离职了……

面试鹅厂总共进行了7轮&#xff0c;还没有结果。先是面了三轮&#xff0c;然后hr告诉她没hc了&#xff0c;然后又推荐了另外一个岗位&#xff0c;又面了四轮。然后追问HR后续的进展&#xff0c;她告诉我已经离职了&#xff0c;让我联系另外一个同事。 这么说吧&#xff0c;大厂…

密码学A5算法VHDL设计及仿真验证

A5算法是一种用于GSM(Global System for Mobile Communications)移动通信标准的加密算法。它是一种对称密钥算法,使用一个64位密钥和一个22位帧号作为输入,生成一个228位的伪随机序列,该序列被用于加密语音和数据通信。 A5算法由三个线性反馈移位寄存器(LFSR)组成,每个…

创建一个Go项目

创建一个Go项目 1.创建项目 package mainfunc main() {println("你好啊&#xff0c;简单点了&#xff01;") }如果是本地的话可以采用go run 项目名的方式。 可以采用go run --work 项目名的方式&#xff0c;此时可以展示日志信息。 如果是只编译的话 go build 项…

1.Buffer_Overflow-1.Basic_Jump

github上面的练习题 git clone https://github.com/Adamkadaban/LearnPwn 然后开始做 先进行 readelf 然后进行执行看看 是怎么回事 ./buf1发现就是一个输入和输出 我们checksec看看 发现stack 保护关闭 开启了NX保护 我们进入ida64看看反汇编 我习惯先看看字符串 SHITF…

MATLAB 之 函数文件、特殊形式的函数和程序调试与优化

文章目录 一、函数文件1. 函数文件的基本结构2. 函数调用2.1 函数调用的格式2.2 函数的递归调用2.3 函数参数的可调性2.4 全局变量与局部变量 二、特殊形式的函数1. 子函数2. 内联函数3. 匿名函数 三、程序调试与优化1. 程序调试方法1.1 利用调试函数进行程序测试1.2 利用调试工…

【Linux】多线程概念再理解

文章目录 1. 物理内存与磁盘的关系如何理解物理内存&#xff1f;凭什么物理内存要分为一个个4KB大小&#xff1f;若以块方式存储&#xff0c;则多出的空间是否浪费&#xff1f; 2. 虚拟地址到物理地址的转换3. 缺页中断4. 为什么字符常量区是不允许被修改的&#xff1f;5. 线程…

七大软件架构设计原则详解

目录 1、概述 2、七大设计原则 2.1、开闭原则 2.2、里氏替换原则 2.3、依赖倒置原则 2.4、单一职责原则 2.5、接口隔离原则 2.6、迪米特法则 2.7、合成复用原则 3、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…

22 KVM管理虚拟机-查询虚拟机信息

文章目录 22 KVM管理虚拟机-查询虚拟机信息22.1 概述22.2 前提条件22.3 查询主机上的虚拟机信息22.4 查询虚拟机基本信息22.5 查询虚拟机基本信息示例 22 KVM管理虚拟机-查询虚拟机信息 22.1 概述 管理员在管理虚拟机的过程中经常需要知道一些虚拟机信息&#xff0c;libvirt提…

机器学习强基计划10-1:为什么需要集成学习?核心原理是什么?

目录 0 写在前面1 集成学习概念与优势2 结合策略梳理2.1 加权平均法2.2 投票法2.3 学习法 3 误差-分歧分解 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

工业能效提升行动计划-安科瑞EMS能效管理平台解决方案

摘要 2022年6月29日工信部、发改委、财政部、生态环境部、国资委、市场监管总局六部门联合下发《关于印发工业能效提升行动计划的通知》&#xff08;工信部联节〔2022〕76号&#xff0c;以下简称《行动计划》&#xff09;&#xff0c;主要目的是为了提高工业领域能源利用效率&…

读《Spring Boot 3核心技术与最佳实践》有感

我是谁&#xff1f; &#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a;CSDN、掘金、infoQ、51CTO等 &#x1f389;简介&#xff1a;CSDN/阿里云/华为云/51CTO博客专家&#xff0c;C站历届博客之星Top50&#xff0c;掘金/InfoQ/51CTO等社区优质创作者&am…

硬件系统工程师宝典(23)-----磁珠选型,你做对了吗?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到常用的电容种类有铝电解电容、钽电容、陶瓷电容、OSCON固态电容和薄膜电容&#xff0c;应用时都有各自的特点&#xff1b;电感可分为电源…