没有合适的资源?快使用搜索试试~ 我知道了~
Java面向对象(高级)- 类的成员之五:内部类(InnerClass)
需积分: 5 0 下载量 64 浏览量
2023-12-02
14:00:41
上传
评论
收藏 1.99MB PDF 举报
温馨提示
试读
49页
Java面向对象(高级)-- 类的成员之五:内部类(InnerClass)
资源推荐
资源详情
资源评论
一、 概述
(1) 介绍
1. 什么是内部类
2. 为什么要声明内部类
3. 内部类使用举例
4. 内部类的分类
(2)举例
(3)重点知识
1. 对成员内部类的理解
2. 创建成员内部类的实例
2.1 静态成员内部类
2.2 非静态成员内部类
3. 在成员内部类中调用外部类的结构
3.1 非静态成员内部类的方法里面调用属性
3.2 非静态成员内部类调用方法
3.3 字节码文件
4. 局部内部类的使用
4.1 介绍
4.2 开发中
4.3 字节码文件
4.4 再举例
二、 成员内部类
(1)概述
(2) 创建成员内部类对象
(3)举例
三、 局部内部类
(1)非匿名局部内部类
(2) 匿名内部类
四、练习
(1)练习1
(2)练习2
1. 接口
2. 抽象类
3. 代码
一、 概述
面向对象三条主线:
①类及类的内部成员(属性、方法、构造器;代码块、内部类)
②封装、继承、多态
③关键字
平时开发的时候,自己定义内部类的机会比较少,一般都是源码会使用,我们要知道它怎么用的即
可。
(1) 介绍
1. 什么是内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为 内部类(InnerClass) ,类B则称为 外部
类(OuterClass) 。
2. 为什么要声明内部类
具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B(用一个变量不足以刻画它,
里面可能还有更丰富的属性、方法)进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,
不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。
平常我们自己设计的时候,可能会将类A与类B设计为并列结构,但是源码会更加规范,它发现类B
只在类A里面使用,那就不妨将类B声明在类A里面,表明只在A里面用,那么这个类B就是内部类。
总的来说,遵循 高内聚、低耦合 (该隐藏的隐藏、该暴露的暴露)的面向对象开发原则。
3. 内部类使用举例
<1> Thread 类内部声明了State类(状态),表示线程的生命周期。
<2> HashMap 类中声明了Node类,表示封装的key和value。
4. 内部类的分类
根据内部类声明的位置(如同 变量 的分类),我们可以分为:
成员内部类:直接声明在外部类的里面。(方法、构造器的外面)
使用static修饰的:静态的成员内部类(跟外部类的类相关,随着类的加载而加载)
不使用static修饰的:非静态的成员内部类(跟外部类的对象相关,随着对象的创建
而加载)
局部内部类:声明在方法内、构造器内、代码块内的内部类
匿名的局部内部类
非匿名的局部内部类
(2)举例
(3)重点知识
内部类这节要讲的知识:
成员内部类的理解。
如何创建成员内部类的实例。
如何在成员内部类中调用外部类的结构。
局部内部类的基本使用。
class Person{ //外部类
//静态成员内部类
static class Dog{ //只供Person使用,并不是属于Person的一部分
}
//非静态成员内部类
class Bird{
}
//方法
public void method(){
//局部内部类
class InnerClass1{
}
}
//构造器
public Person(){
//局部内部类
class InnerClass2{ //可以与方法method()中的InnerClass1重名
}
}
//代码块
{
//局部内部类
class InnerClass3{
}
}
}
1. 对成员内部类的理解
关于 成员内部类 的理解:
从类的角度看:
内部可以声明属性、方法、构造器、代码块、内部类等结构。
此内部类可以声明父类,可以实现接口(单继承,多实现)。
可以使用 final 修饰(不能有子类)。
可以使用 abstract 修饰(不能实例化)。
从外部类的成员的角度看:
在内部可以调用外部类的结构。比如:属性、方法等
除了使用 public 、 缺省权限 修饰之外,还可以使用 private 、 protected 修饰。
(以前说的类都是外部类,可以使用public、默认权限之外,不能使用private)而
成员可以使用四种权限来修饰。
可以使用 static 修饰。(外部类用static修饰没有意义)
2. 创建成员内部类的实例
2.1 静态成员内部类
创建Person的静态的成员内部类Dog。
Dog是静态的,随着类的加载而加载,要创建Dog的对象,不需要创建Person的对象。
若直接new一个Dog,又不合适,因为Dog也没有对外暴露。会报错,如下:
当然要说清楚是谁里面的Dog呀,所以需要这样: new Person.Dog();
那前面声明呢?直接是Dog吗?不行哦,看下面:
public class OuterClassTest {
public static void main(String[] args) {
//1.创建Person的静态的成员内部类的实例
}
}
class Person{ //外部类
//静态成员内部类
static class Dog{ //只供Person使用,并不是属于Person的一部分
}
}
同样需要说明是谁里面的Dog,这样: Person.Dog dog=new Person.Dog();
此时Dog里面的方法,就可以调用啦。
比如:
🌱
代码
🍺
输出结果
2.2 非静态成员内部类
创建Person的非静态的成员内部类的实例。
非静态的结构都需要依赖外部类的对象,所以要想创建Bird类的对象,就需要先创建外部类Person
的对象。
若是像上面那种写法是不行的(因为Bird不是静态的),如下:
需要先创建Person的对象: Person p1=new Person();
接下来的写法很容易写错,这样来写: p1.new Bird();
public class OuterClassTest {
public static void main(String[] args) {
//1.创建Person的静态的成员内部类的实例
Person.Dog dog=new Person.Dog();
dog.eat();
}
}
class Person{ //外部类
//1.静态成员内部类
static class Dog{ //只供Person使用,并不是属于Person的一部分
public void eat(){
System.out.println("狗吃骨头");
}
}
}
剩余48页未读,继续阅读
资源评论
雨翼轻尘
- 粉丝: 6w+
- 资源: 130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功