内部类
什么是内部类
在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 类名或者接口名(){
重写方法
}
包括继承或实现,方法的重写,创建对象
整体就是一个类的子类对象或者接口的实现类对象
使用场景
当方法的参数是接口或者类时
以接口为例,可以传递这个接口的实现类对象
如果实现类只使用一次,可以用匿名内部类来简化代码
标签:部类,演示,内部,对象,创建对象,接口,详解,Java,方法 From: https://blog.csdn.net/qq_30500575/article/details/139264104