网站首页 > 精选教程 正文
概念
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
什么时候使用内部类
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用
比如汽车只有一个发动机,电脑只有一个CPU
内部类的分类
按定义的位置来分
1. 成员内部内,类定义在了成员位置 (类中方法外称为成员位置)
2. 局部内部类,类定义在方法内
成员内部类
成员内部类:定义在类中方法外的类。
格式
class 外部类 {
// 成员变量
// 成员方法
class 内部类 {
// 成员变量
// 成员方法
}
}
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类Car中包含发动机类Engine,这时,Engine就可以使用内部类来描述,定义在成员位置。
示例
class Car { //外部类
class Engine { //内部类
}
}
访问特点
内部类可以直接访问外部类的成员,包括私有成员。
创建内部类对象格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
示例
public class Body {
public boolean live = true;
public void walk() {
System.out.println("散散步");
}
class Heart {
public void jump() {
// 直接访问外部类成员
if (live) {
System.out.println("脚离地了");
} else {
System.out.println("智商又占领高地了");
}
}
}
}
测试类
public class Test {
public static void main(String[] args) {
// 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
// 创建的是内部类对象
// Body.Heart heart = new Body().new Heart();
// heart.jump();
// 创建方式2:先创建外部类,再创建内部类
// 创建外部类对象
Body b = new Body();
// 创建内部类对象
Body.Heart heart = b.new Heart();
// 调用内部类方法
heart.jump();
// 调用外部类方法
b.live = false;
// 调用内部类方法
heart.jump();
}
}
局部内部类
局部内部类:定义在方法中的类。
格式
class 外部类名 {
数据类型 变量名;
修饰符 返回值类型 方法名(参数列表) {
// …
class 内部类 {
// 成员变量
// 成员方法
}
}
}
使用: 在定义好局部内部类后,直接就创建对象
访问特点
内部类可以直接访问外部类的成员,包括私有成员。
匿名内部类(重点)
匿名内部类:是内部类的简化写法。它的本质是一个带具体实现的父类或者父接口的匿名的子类对象。开发中,最常用到的内部类就是匿名内部类了。
之前我們使用接口时,似乎得做如下几步操作:
1. 定义子类
2. 重写接口中的方法
3. 创建子类对象
4. 调用重写后的方法
interface Swim {
public abstract void swimming();
}
// 1. 定义接口的实现类
class Student implements Swim {
// 2. 重写抽象方法
@Override
public void swimming() {
System.out.println("仰泳");
}
}
public class Test {
public static void main(String[] args) {
// 3. 创建实现类对象
Student s = new Student();
// 4. 调用方法
s.swimming();
}
}
我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。
匿名内部类前提
匿名内部类必须继承一个父类或者实现一个父接口。
格式
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
使用方式
示例
interface Swim {
public abstract void swimming();
}
// 1. 定义接口的实现类
class Student implements Swim {
// 2. 重写抽象方法
@Override
public void swimming() {
System.out.println("仰泳");
}
}
public class Test {
public static void main(String[] args) {
// 使用匿名内部类
new Swim() {
@Override
public void swimming() {
System.out.println("蛙泳");
}
}.swimming();
// 接口 变量 = new 实现类(); 多态,走子类的重写方法
Swim s2 = new Swim() {
@Override
public void swimming() {
System.out.println("游泳");
}
};
s2.swimming();
s2.swimming();
}
}
匿名内部类的本质
1. 定义一个没有名字的内部类
2. 这个类实现了Swim接口
3. 创建了这个没有名字的类的对象
匿名内部类的作用
简化代码
匿名内部类的使用场景
通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。示例:
interface Swim {
public abstract void swimming();
}
// 1. 定义接口的实现类
class Student implements Swim {
// 2. 重写抽象方法
@Override
public void swimming() {
System.out.println("仰泳");
}
}
public class Test {
public static void main(String[] args) {
// 普通方式传入对象
// 创建实现类对象
Student s = new Student();
goSwimming(s);
// 匿名内部类使用场景:作为方法参数传递
Swim s3 = new Swim() {
@Override
public void swimming() {
System.out.println("顾泳");
}
};
// 传入匿名内部类
goSwimming(s3);
// 完美方案: 一步到位
goSwimming(new Swim() {
public void swimming() {
System.out.println("小学生, 蛙泳");
}
});
goSwimming(new Swim() {
public void swimming() {
System.out.println("中学生, 潜泳");
}
});
}
// 定义一个方法,模拟请一些人去游泳
public static void goSwimming(Swim s) {
s.swimming();
}
}
猜你喜欢
- 2025-01-23 Python闭包|你应该知道的常见用例(上)
- 2025-01-23 如何对配电柜局部放电情况进行有效监测及分析?
- 2025-01-23 Python闭包|你应该知道的常见用例(下)
- 2025-01-23 室内装饰设计施工图(室内装饰设计施工图设计阶段要做什么)
- 2025-01-23 Python启航:30天编程速成之旅(第12天)- 类
- 2025-01-23 张一飞:人类走到了全球战略文化的“十字路口”
- 2025-01-23 对话腾讯集团副总裁李强:大模型日趋理性,生态应用需要伙伴来实现
- 2025-01-23 急性阴道炎阴道瘙痒怎么办(霉菌性阴道炎反复发作怎么办)
- 2025-01-23 闭包,一个非常实用但容易被忽视的宝藏Python知识点
- 2025-01-23 JDK 17 本地变量类型推断的深度解析与应用场景
你 发表评论:
欢迎- 07-10动漫人物像|插画 壁纸 头像 签名 素材
- 07-10运动人物|插画 壁纸 头像 签名 素材
- 07-10动漫人物|插画 壁纸 头像 签名 素材
- 07-10神话人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物像|插画 壁纸 头像 签名 素材
- 07-10 日漫人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物风|插画 壁纸 头像 签名 素材
- 07-10日漫人物|插画 壁纸 头像 签名 素材
- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)