Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
文章目录
- 内部类
- 17.1概述
- 17.2成员内部类
- 17.2.1 获取成员内部类对象
- 17.2.2 成员内部类内存图
- 17.3静态内部类
- 17.4局部内部类
- 17.5匿名内部类
- 17.5.1概述
内部类
17.1概述
写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。
如,A类的里面的定义B类,B类就称内部类
public class A{public class B{}
}
内部类表示的事物是外部类的一部分
内部类单独出现没有任何意义
什么时候用到内部类?
B类表示的事物是A类的一部分,且B单独存在没有意义
如:汽车的发动机,ArrayList的迭代器,人的心脏等等
内部类的访问特点:
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须要创建对象
内部类案列:
需求:写一个JavaBean类描述汽车
属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限。
public class Car {//Car类是外部类private String carName;int carAge;String carColor;public void show(){System.out.println(carName);//nullSystem.out.println(carAge);//1// 外部类要访问内部类的成员,必须要创建对象Engine e = new Engine();e.engineName="比亚迪";System.out.println(e.engineName);//比亚迪}class Engine{//Engine类是内部类String engineName;int engineAge;}}
============================================public class Test {public static void main(String[] args) {Car car = new Car();car.carAge=1;car.carColor="黑色";car.show();//null 1 比亚迪}
}
17.2成员内部类
写在成员位置,属于外部类成员
成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等
在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
public class Car {//Car类是外部类private String carName;int carAge;String carColor;class Engine{//Engine类是成员内部类String engineName;int engineAge;}}
17.2.1 获取成员内部类对象
方式一:外部直接创建成员内部类的对象
格式:外部类.内部类 变量 = new 外部类().new 内部类();
public class Outer {// 成员内部类,属于外部类对象的。// 拓展:JDK16之前成员内部类不能定义静态成员。public class Inner{// 这里面的东西与类是完全一样的。public void method(){System.out.println("内部类中的方法被调用了");}}
}
========================================================public class Test {public static void main(String[] args) {// 宿主:外部类对象。// Outer out = new Outer();// 创建内部类对象。//方式一:外部直接创建成员内部类的对象Outer.Inner oi = new Outer().new Inner();oi.method();}
}
方式二:在外部类中定义一个方法提供内部类的对象(内部类是私有的)
public class Outer {String name;private class Inner{static int a = 10;}//在外部类中定义一个方法提供内部类的对象public Inner getInstance(){return new Inner();}
}
==================================public class Test {public static void main(String[] args) {Outer o = new Outer();//第一种接收//Object o = o.getInstance()//第二种,直接打印System.out.println(o.getInstance());}
}
17.2.2 成员内部类内存图
public class Outer {private int a = 10;class Inner {private int a = 20;public void show() {int a = 30;//Outer.this 获取了外部类对象的地址值System.out.println(Outer.this.a);//10System.out.println(this.a); //20System.out.println(a); //30}}
}
============================================================public class Test {public static void main(String[] args) {//创建内部类的对象,并调用show方法Outer.Inner oi = new Outer().new Inner();oi.show();}
}
(图片来自B站Java视频)
17.3静态内部类
成员内部类的一种
public class Car {//Car类是外部类private String carName;int carAge;String carColor;static class Engine{//Engine类是静态内部类String engineName;int engineAge;}}
- 静态内部类可以直接访问外部类的静态变量和静态方法。
- 静态内部类不可以直接访问外部类的非静态成员,如果要访问需要创建外部类的对象。
静态内部类对象的创建格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用方法的格式:
- 调用非静态方法的格式:先创建对象,用对象调用
- 调用静态方法的格式:外部类名.内部类名.方法名();
案例:
public class Outer {int a = 6;static int b = 8;//静态内部类static class Inner {public void show1(){// 静态内部类可以直接访问外部类的静态变量System.out.println(b);// 如果访问外部类非静态,需要先创建外部类对象Outer o = new Outer();System.out.println(o.a);System.out.println("非静态的方法被调用了");}public static void show2(){System.out.println("静态的方法被调用了");}}
}
=====================================public class Test {public static void main(String[] args) {// 调用非静态方法需要,先创建对象,再用对象调Outer.Inner oi = new Outer.Inner();oi.show1();// 8 6 非静态的方法被调用了// 静态方法用类名直接调用Outer.Inner.show2();//调用内部类中的静态方法,用内部类名调也可以oi.show2();}
}
17.4局部内部类
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
- 外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
public class Outer {int b = 20;public void show(){int a = 10;//局部内部类class Inner{String name;int age;public void method1(){System.out.println(a);System.out.println(b);System.out.println("局部内部类method1方法");}public static void method2(){System.out.println("局部内部类method2静态方法");}}//(在show方法中)创建局部内部类的对象Inner i = new Inner();System.out.println(i.name);System.out.println(i.age);i.method1();Inner.method2();}}
==============public class Test {public static void main(String[] args) {/*局部内部类1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。2.外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。*///调用show方法,让代码执行Outer o = new Outer();o.show();//输出:null 0 10 20 局部内部类method1方法 // 局部内部类method2静态方法}
}
17.5匿名内部类
使用场景:
- 当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象。
- 如果实现类只要使用一次,可以用匿名内部类简化代码。
17.5.1概述
匿名内部类本质就是隐藏了名字的内部类。
匿名内部类的格式:
此格式整体就是一个类的子类对象或者接口的实现类对象
new 类名或者接口名(){重写方法;
};如:new Animal(){@Overridepublic void eat() {System.out.println("重写了eat方法...");}};此格式包含三部分:继承(类)/实现(接口) 方法重写 创建对象实际上:
匿名内部类指的是:{重写方法;};而匿名内部类的对象指的是:new 类名或者接口名(){重写方法;};
以前:
//父类
public abstract class Animal {public abstract void eat();
}
============================================//子类public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗在吃东西...");}
}
============================================//测试类public static void main(String[] args) {/*
在测试类中调用下面的method方法?
以前的方式如何调用?
要自己写一个子类继承Animal类
再创建子类的对象,传递给method方法*///第一种方式调用methodDog dog = new Dog();method(dog); //输出:狗在吃东西...//如果Dog类我只要用一次,那么还需要单独定义一个类太麻烦了。}//定义方法
public static void method(Animal a){//Animal a = 子对象 ->多态a.eat();//执行看左边,编译看右边}
}
现在:无需创建子类…
public abstract class Animal {public abstract void eat();
}
============================================public class Test {public static void main(String[] args) {method(new Animal() {@Overridepublic void eat() {System.out.println("小黑在吃东西...");}});}//定义方法public static void method(Animal a){a.eat();}
}
接口多态
public interface Swim {public abstract void swim();
}
===========================================public class Test02 {public static void main(String[] args) {//接口多态Swim s = new Swim() {@Overridepublic void swim() {System.out.println("重写swim接口的方法...");}};s.swim();}
}
public interface Swim {public abstract void swim();
}
===========================================public class Test02 {public static void main(String[] args) {//接口多态Swim s = new Swim() {@Overridepublic void swim() {System.out.println("重写swim接口的方法...");}};s.swim();}
}
相关文章:

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
文章目录 内部类17.1概述17.2成员内部类17.2.1 获取成员内部类对象17.2.2 成员内部类内存图 17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述 内部类 17.1概述 写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。 如,A类的里面的定义B类&#x…...

操作系统笔记三
进程 把一个静态程序通过OS在内存中让cpu执行起来的动态执行过程叫进程 写代码都是用户态,而进程在执行过程中需要完成特定的功能,这些功能呢只有操作系统能提供,比如说读写文件,读写文件的过程是与硬盘打交道,这个过程…...

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点
uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…...

基于微信小程序的商品展示+ssm(lw+演示+源码+运行)
商品展示系统 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序被用户普遍使用,为方…...

【Linux】常用指令(下)(内含more、less、 head、tail、date、find、grep、zip、tar以及学习笔记)
文章目录 前言1. more指令2. less指令(重要)3. head指令4. tail指令5. 管道(做到学会使用即可)6. date指令6.1 时间戳 7. cal指令8. find指令9. grep指令10. zip/unzip指令11. tar指令 前言 Linux下的常用指令终于要在本文落下帷…...

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载
目录 抽象工厂模式 思维导图 接口(抽象类) 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 (1)产品接口,生成具体人物 (2)武器接口,生成具体…...

Leetcode3289. 数字小镇中的捣蛋鬼
Every day a Leetcode 题目来源:3289. 数字小镇中的捣蛋鬼 解法1:哈希 代码: /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…...

13_Python的高阶函数
高阶函数 高阶函数是Python编程中一个非常强大和有用的特性,它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数: 接受一个或多个函数作为输入(也就是说,它的参数之一是函数&#…...
清空当前机器所有Docker容器和镜像
sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作,因为它会删除所有镜像,包括那些可能正在被容器使用的镜像。在执行此操作之前…...
FreeRTOS学习——Systick中断、SVC中断、PendSV中断
FreeRTOS学习——接口宏portmacro.h,仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 port :GCC/ARM_CM7 文章目录 Systick源码触发方式 SVC源码触发方式 PendSV源码触发方式 相关汇编指令 Systick 源码 在Systick中断xPortSysTickHandler中&am…...
汇量科技大数据面试题及参考答案
如何在 SQL 中处理三个字段完全一样的去重?在 Scala 中又该如何实现? 在 SQL 中,可以使用多种方法来处理三个字段完全一样的去重。一种常见的方法是使用 DISTINCT 关键字结合多个字段来实现。例如,假设有表 table_name,包含字段 field1、field2 和 field3,可以使用以下 S…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树
1.AVL 树 1.1AVL 树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962…...
Python 的数据类型与操作
一、常用内置类型(Built - in Types) Python 拥有多种内置数据类型,这些类型满足了各种编程需求,从简单的数据存储到复杂的数据结构表示。 1. 数值类型(Numeric Types) 整数(int)&a…...

Python燃烧废气排放推断算法模型
🎯要点 宏观能耗场景模型参数化输入数据,分析可视化输出结果,使用场景时间序列数据模型及定量和定性指标使用线图和箱线图、饼图、散点图、堆积条形图、桑基图等可视化模型输出结果根据气体排放过程得出其时间序列关系,使用推断模…...

Qt中多语言的操作(以QtCreator为例)
1、首先,我们在代码中与文本相关的且需要支持多语言的地方,用tr来包含多语言key(多语言key是我们自己定义的),如下 //举例 QPushButton* btnnew QPushButton(this); btn->move(20,20); btn->resize(100,50); //…...

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

html+css学习
html 元素 html元素是HTML的根元素,一个文档只能有一个,其他所有元素都是其后代元素 html有一个属性为lang,其作用是: 帮助语言合成工具确定要使用的发音帮助翻译工具确定要使用的翻译规则 当属性lang“en”则表示告诉其浏览器…...
2.gitlab ce 细粒度的权限控制
需求: 在提交merge reqeust时,必须指定审核人,并且要选审核人清单里的 有个code owners应该可以做到(gitlab ce应该也可以用) 下面是参考的文档 细粒度的代码权限怎么做?极狐GitLab 代码所有者来帮忙 -…...
G - Merchant Takahashi / F - Useless for LIS
G - Merchant Takahashi 首先考虑暴力 DP。 设最后一步走到编号 ii 的城镇的方案的最大收益为 fifi,则每次集市相当于是 fTi←fj−C∣Ti−j∣Pi(1≤j≤n)。 这样每次可以通过枚举 j 来转移,这样总时间复杂度是 O(nm) 的&…...
自然语言处理实例
引子:基于聊天机器人项目的自然语言处理(NLP)学习路线 自然语言处理(Natural Language Processing,简称 NLP)是人工智能的重要分支,旨在帮助计算机理解、生成和处理人类语言。NLP 技术广泛应用于搜索引擎、机器翻译、语音识别、文本摘要、情感分析、对话系统等领域。为…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...