Java 五种内部类演示及底层原理详解

简介: Java 五种内部类演示及底层原理详解

内部类

什么是内部类

在A类的内部定义B类,B类就被称为内部类

发动机类单独存在没有意义 发动机为独立个体

可以在外部其他类里创建内部类的对象去调用方法

类的五大成员

属性 方法 构造方法 代码块 内部类

内部类的访问特点

内部类可以直接访问外部类的成员,包括私有

外部类要访问内部类的成员,必须创建对象

访问特点原因

如果在测试类中调用show方法 必须先创建对象

然后给对象的属性赋值

当当前方法被调用时

java虚拟机会把调用方法者的地址值传递给this

所以在代码中打印 时 打印调用者的信息

不然就找不到了 找不到对象

ArrayList类源代码

ArrayList类 集合类

集合存储数据

通过遍历可以获得数据

ArrayListL里有个内部类叫迭代器Itr

对于集合类来说相对独立,而又属于集合,所以设为内部类

对内部类总结

1.什么是内部类

写在一个类里面的类叫做内部类

2.什么时候用到内部类

B类表示的事物是A类的一部分,且B单独存在没有意义

比如汽车的发动机 ArrayList类的迭代器 人的心脏

内部类的种类

成员内部类

了解

写在成员位置 属于外部类的成员

成员内部类代码如何书写

如果用private私有修饰内部类对象

那只能在外部类中创建对象

private修饰符 只能在本外部类中使用

默认权限可以只在本包中使用

protected修饰符 可以在本包中的其他类中使用 可以在其他包的子类也可以用

外面的孩子也是受保护的

public修饰符 公共的 随处都可以创建对象

如何创建成员内部类的对象

方法1: 直接创建格式 外部类名.内部类名 对象名=外部类对象.内部类对象

成员内部类实际上和成员变量 成员方法本质是一样的

通过创建对象去调用 注意使用链式编程

方式2:在外部类中编写方法 对外提供内部类的对象

通过在外部类编写 getInstance方法 获得被private修饰的内部类方法

测试类接收方法

两种方式

1.用父类接收 形成多态

2.直接获取对象

面试题

内存图

在堆内存里外部类对象先加载进去 再加载内部类对象 开辟新空间

java会给内部类对象一个隐藏的this变量用来记录外部类的地址值

总结

静态内部类

静态内部类只能访问外部类中的静态变量和静态方法

如果想要访问非静态的需要创建对象

只要是静态的东西都可以用类名.直接使用

调用非静态内部类中的方法

调用静态内部类中的方法

总结

特殊的成员内部类 静态内部类

创建静态内部类对象的方式 Outer.inner.oi=new Outer.Inner();

如何调用静态内部类中的方法

局部内部类

了解即可

将内部类定义在方法里面

类似于方法里的局部变量

外部是无法直接使用的 需要在方法内部创建对象并使用

该类可以直接访问外部类的成员 也可以访问方法内的局部变量

匿名内部类

相对最重要的

匿名内部类本质上是隐藏了名字的内部类

书写格式

如下图

匿名内部类实质上是swim类接口的实现类

student类实现swim类接口

重写swim类中的抽象方法

实现后 上去名字

swim后花括号里的内容即为swim接口的实现类

先把前面的class去掉 剩下的内容就是一个没有名字的类

表示这个没有名字的类实现的swim类的接口 所以要在类中重写接口中所有的抽象方法

如何创建没有名字类的对象

创建对象 new 类名();

即把new方法放到swim前面 再在后面加上()表示用空参构造构建

new是创建花括号里没有名字类的对象

匿名内部类实际上是对象 整体是一个对象 即为匿名内部类的对象

中间的格式

继承关系

花括号里的内容是animal的子类

等号左右是接口 右边是接口实现类对象

形成接口多态

并且

总结

匿名内部类是隐藏了名字的内部类

可以写在成员位置 也可以写在局部位置

格式:

new 类名或者接口名(){

重写方法

}

包括继承或实现,方法的重写,创建对象

整体就是一个类的子类对象或者接口的实现类对象

使用场景

当方法的参数是接口或者类时

以接口为例,可以传递这个接口的实现类对象

如果实现类只使用一次,可以用匿名内部类来简化代码

目录
相关文章
|
10天前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
1月前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
1月前
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
6天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
5天前
|
Java
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
本文介绍了拼多多面试中的模拟拼团问题,通过使用 `CyclicBarrier` 实现了多人拼团成功后提交订单并支付的功能。与之前的 `CountDownLatch` 方法不同,`CyclicBarrier` 能够确保所有线程到达屏障点后继续执行,并且屏障可重复使用。文章详细解析了 `CyclicBarrier` 的核心原理及使用方法,并通过代码示例展示了其工作流程。最后,文章还提供了 `CyclicBarrier` 的源码分析,帮助读者深入理解其实现机制。
|
5天前
|
Java
Java的aop是如何实现的?原理是什么?
Java的aop是如何实现的?原理是什么?
14 4
|
9天前
|
存储 Java
JAVA并发编程AQS原理剖析
很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》,希望可以帮到大家巩固相关核心技术原理。今天我们聊聊AQS....
|
6天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
16天前
|
缓存 Java 编译器
JAVA并发编程volatile核心原理
volatile是轻量级的并发解决方案,volatile修饰的变量,在多线程并发读写场景下,可以保证变量的可见性和有序性,具体是如何实现可见性和有序性。以及volatile缺点是什么?
|
17天前
|
监控 算法 Java
掌握Java的垃圾回收机制:从原理到实践
在Java的世界中,垃圾回收(Garbage Collection,简称GC)是一块神秘的领域,它如同一位默默无闻的清洁工,确保内存中不再使用的对象得到妥善处理。本文将带你走进垃圾回收的大门,探索它的工作原理、常见算法及其在实际应用中的调优策略。无论你是初学者还是有一定经验的开发者,这篇文章都将为你揭开垃圾回收的神秘面纱,让你的Java程序运行得更加高效和稳定。
35 5