当前位置: 首页 > news >正文

内部类(超详细)

内部类

一:初始内部类

(1)什么是内部类?

类的五大成员:属性、方法、构造方法、代码块、内部类

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

public class Outer { // 外部类public class Inter { // 内部类}
}
public class Test { // 外部其他类public static void main(Strig[] args) {}
}

(2)为什么要学习内部类?

需求:写一个JavaBean类描述汽车

属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限

public class Car {Stirng carName;int carAge;String carColor;String engineName;int engineAge;
}
// 上面这种乍一看没什么问题,但是发动机是一个独立的个体,跟车本身还是有一些区别的,所以跟发动机相关的属性我们不应该和车定义
//在一起,是不是可以再定义一个发动机的类?是的可以。但是发动机是需要依赖车存在的,发动机如果单独存在是没有实际意义的,所以最好
//的解决方案是把发动机Engine这个类定义在Car类的里面,这样就满足要求,这样就表示车的里面有发动机,而发动机又是一个独立的个体。
//此时Car就是外部类,Engine就是内部类
public class Car { // 外部类Stirng carName;int carAge;String carColor;class Engine { // 内部类String engineName;int engineAge;}
}

内部类表示的事物是外部类的一部分,内部类单独出现没有任何意义

(2)内部类的访问特点:

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

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

public class Test {public static void main(String[] args) {Car c = new Car();c.setCarName("宾利");c.setCarAge(1);c.setCarColor("粉色");// 调用show方法的时候会把当前调用者的地址值传递给show方法的形参,// 所以show方法的形参有一个隐含的this关键字,用this去访问自己类里面属性没问题// 用this去访问Engin里面的engineName找不到,所以需要在show方法里面创建// Engin类的对象,用对象才能找到engineNamec.show();}
}class Car {private String carName;private int carAge;private String carColor;class Engine {private String engineName;private int engineAge;public void show() {System.out.println(engineName);// 内部类可以直接访问外部类的成员,包括私有System.out.println(carName);}}public void show(Car this) {// 是打印调用者车的名字:宾利System.out.println(this.carName);System.out.println(this.engineName); // ???Engine e = new Engine();System.out.println(e.engineName);}
}

以后这个内部类怎么用呢?看一段java的源代码就知道了:

看ArrayList的源码,找到Itr这个类,

ArrayList是一个集合,集合的作用就是用来帮我们存储元素的,我们可以把数据往集合里面放,也可以通过遍历的方式把集合里面的元素获取出来,但是ArrayList的遍历方式有很多很多种,之前我们仅仅是用for循环遍历,除了for循环还有很多遍历方式。这里看到的Itr专业叫做迭代器,也是一种遍历方式,这种集合遍历方式对于集合来讲是相对独立的,但是他又属于集合,所以Java就把迭代器这个类设计成了ArrayList的内部类。一定要先有集合才能有迭代器,所以Java就把迭代器设计成了ArrayList的内部类。

(3)小结

1、什么是内部类?

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

2、什么时候用到内部类?

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

比如:汽车的发动机、ArrayList的迭代器、人的心脏等等。

二:成员内部类(了解)

1、成员内部类的代码如何书写

1)写在成员位置的,属于外部类的成员。比如刚刚写的Car类和Engine类。他跟外面的成员变量、成员方法的地位是一模一样的。

public class Car { // 外部类Stirng carName;int carAge;String carColor;class Engine { // 内部类String engineName;int engineAge;}
}

2)成员内部类可以被一些修饰符所修饰,比如:private、默认、protected、public、static等

如果用private私有去修饰成员内部类的话,那么在外界就不能直接创建成员内部类的对象,只能在外部类的里面去创建内部类的对象,因为private是只能在本类中使用。

3)在成员内部类里面,JDK16前不能定义静态变量,JDK16开始才可以定义静态变量

public class Outer {String name;private class Inner {static int a = 10; // JDK16以下会报错}public Inner getInstance() {return new Inner();}
}

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

1、方式一:在外部类中编写方法,对外提供内部类的对象

这种方式用在用private修饰内部类的时候用这种

比如集合的迭代器Itr这个内部类,它使用private修饰的private class Itr implements Iterator<E> {},外界如何获取迭代器Itr的对象?

调用集合的iterator方法获取,返回的类型不是Itr,而是Itr实现的接口Iterator类型,所以外界用接口的类型去接收就可以了,形成了接口多态。

public Iterator<E> iterator() {return new Itr();}

如果不是用private修饰的一般用第二种方式获取内部类的对象

相关文章:

  • [数据集][目标检测]盲道检测数据集VOC+YOLO格式2173张1类别
  • TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性
  • <vs2022><问题记录>visual studio 2022使用console打印输出时,输出窗口不显示内容
  • 如何在virtualbox上安装Linux系统(centerOS)
  • Java常见错误-内部类-简要分析
  • 贰[2],VisionMaster/.NetCore的WPF应用程序调用控件
  • 佛教祭拜小程序-寺庙小程序-纪念馆小程序
  • 【Python】pip 使用方法详解
  • Execl数据导入 EasyExcel实现
  • PICRUSt2在微生物功能预测分析中的应用解读
  • 【区分vue2和vue3下的element UI TimePicker 时间选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • Qt+qss动态属性改变控件状态切换的样式
  • Flutter打包网络问题解决办法
  • 【Go语言精进之路】构建高效Go程序:了解切片实现原理并高效使用
  • 《编译原理》期末考试复习手写笔记(二)+真题(第四、五、六章)+课后习题答案
  • 《剑指offer》分解让复杂问题更简单
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Docker 笔记(2):Dockerfile
  • ECMAScript6(0):ES6简明参考手册
  • Java小白进阶笔记(3)-初级面向对象
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue.js 移动端适配之 vw 解决方案
  • Vue2.0 实现互斥
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 高度不固定时垂直居中
  • 关于for循环的简单归纳
  • 好的网址,关于.net 4.0 ,vs 2010
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 七牛云假注销小指南
  • 使用putty远程连接linux
  • 为视图添加丝滑的水波纹
  • 限制Java线程池运行线程以及等待线程数量的策略
  • postgresql行列转换函数
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​低代码平台的核心价值与优势
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #if和#ifdef区别
  • #考研#计算机文化知识1(局域网及网络互联)
  • (Java)【深基9.例1】选举学生会
  • (独孤九剑)--文件系统
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (蓝桥杯每日一题)love
  • (篇九)MySQL常用内置函数
  • (十五)、把自己的镜像推送到 DockerHub
  • ***监测系统的构建(chkrootkit )
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 设计模式初探
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)