Java基础 - 内部类03 - 匿名内部类详解
·
1.什么是匿名内部类
定义 :
1.匿名内部类
是定义在类的局部位置
,如方法中、代码块中,且没有明确的类名
;
2.是一个内部类,本质还是一个类
;
3.没有类名;
4.同时还是一个对象
。
2.匿名内部类的特性(关键)
* 1.匿名内部类可以访问所有的外部类的成员,包括私有的;
* 2.不能添加访问修饰符,因为匿名内部类也是一个局部变量;
* 3.作用域 : 仅在定义它的方法或代码块中有效;
* 4.匿名内部类 访问 外部类的成员的方式 : 直接访问;
* 5.外部其他类 访问 匿名内部类的方式 : 不可以访问,匿名内部类是一个局部变量;
* 6.如果 外部类 和 匿名内部类 的成员重名时,默认遵循就近原则,
* 如果就是想访问 外部类的成员时,使用 【外部类名.this.成员】 的方式;
* 7.匿名内部类是没有名字的,所以也无需写构造器;
* 8.匿名内部类的运行时类型是 【外部类名+$+数字】
3.匿名内部类的语法
* 匿名内部类有两种实现方式:1.实现接口;2.继承一个类。
* 格式如下 :
* new 接口名/类名(args...){
* //内容
* };
4.匿名内部类的示例代码
4.1 声明一个接口
package com.northcastle.B_niming_innerClass;
/**
* author : northcastle
* createTime:2022/2/9
*/
public interface InterfaceA {
void sayHello();
}
4.2 声明一个抽象类
package com.northcastle.B_niming_innerClass;
/**
* author : northcastle
* createTime:2022/2/9
*/
public abstract class ClassA {
abstract void sayHi();
}
4.3 真正的匿名内部类的代码(核心代码,必看)
package com.northcastle.B_niming_innerClass;
/**
* author : northcastle
* createTime:2022/2/9
*/
/**
* 本案例演示 : 匿名内部类
*/
public class NimingInnerClass {
//1.外部类的成员
private String field01 = "外部类的私有属性field01";
public String field02 = "外部类的共有属性field02";
//2.外部类的构造器
public NimingInnerClass() {
}
public NimingInnerClass(String field01, String field02) {
this.field01 = field01;
this.field02 = field02;
}
//3.外部类的方法
/**
* 3.1 一个普通的方法
*/
public void method01(){
System.out.println("外部类的方法:method01");
}
/**
* 3.2 实现接口的匿名内部类
*/
public void method02(){
//这个方法中包含实现接口的匿名内部类
//1.匿名内部类的定义
InterfaceA interfaceA_niming = new InterfaceA() {
public String field01 = "接口+匿名内部类中的field01";
@Override
public void sayHello() {
System.out.println("接口+实现接口的匿名内部类对你说 : Hello");
//2.使用匿名内部类的属性
System.out.println("接口匿名内部类的field01 : "+field01);
System.out.println("外部类的field01 : "+NimingInnerClass.this.field01);
System.out.println("外部类的field02 : "+field02);
}
};
//3.判断匿名内部类类型 : 编译类型、运行时类型
System.out.println("接口+匿名内部类 的运行时类型 : "+interfaceA_niming.getClass());
//4.运行匿名内部类对象的方法
interfaceA_niming.sayHello();
}
/**
* 3.3. 继承类的匿名内部类
*/
public void method03(){
//这个方法中包含实现类的匿名内部类
//1.匿名内部类的定义
ClassA classA_niming = new ClassA() {
public String field01 = "类+匿名内部类中的field01";
@Override
void sayHi() {
System.out.println("类+匿名内部类对你说 : Hi");
//2.使用匿名内部类的属性
System.out.println("类+匿名内部类的field01 : "+field01);
System.out.println("外部类的field01 : "+NimingInnerClass.this.field01);
System.out.println("外部类的field02 : "+field02);
}
};
//3.判断匿名内部类类型 : 编译类型、运行时类型
System.out.println("类+匿名内部类 的运行时类型 : "+classA_niming.getClass());
//4.运行匿名内部类的对象的方法
classA_niming.sayHi();
}
/**
* 3.4 作为实参的匿名内部类
* @param interfaceA
*/
public void method04(InterfaceA interfaceA){
// 这里演示最常用的使用方式 : 匿名内部类作为实参传入方法中
interfaceA.sayHello();
}
}
4.4 外部其他类对匿名内部类的使用
package com.northcastle.B_niming_innerClass;
/**
* author : northcastle
* createTime:2022/2/9
*/
public class Application {
public static void main(String[] args) {
//1.定义一个外部类的对象
NimingInnerClass nimingInnerClass = new NimingInnerClass();
//2.调用外部类对象的方法
nimingInnerClass.method01();//普通方法
System.out.println("==============================");
nimingInnerClass.method02();//包含匿名内部类的方法
System.out.println("==============================");
nimingInnerClass.method03();//包含匿名内部类的方法
System.out.println("==============================");
nimingInnerClass.method04(new InterfaceA() { //匿名内部类作为参数的方法
@Override
public void sayHello() {
System.out.println("实参中的匿名内部类向你说 Hello啦");
}
});
}
}
4.5 运行结果
运行结果与特性中表述的一致。
5.完成
Congratulations!
You are one step closer to success!
推荐内容
阅读全文
AI总结
更多推荐
相关推荐
查看更多
A2A

谷歌开源首个标准智能体交互协议Agent2Agent Protocol(A2A)
adk-python

一款开源、代码优先的Python工具包,用于构建、评估和部署灵活可控的复杂 AI agents
Second-Me

开源 AI 身份系统,通过本地训练和部署,模仿用户思维和学习风格,创建专属AI替身,保护隐私安全。
热门开源项目
活动日历
查看更多
直播时间 2025-04-09 14:34:18

樱花限定季|G-Star校园行&华中师范大学专场
直播时间 2025-04-07 14:51:20

樱花限定季|G-Star校园行&华中农业大学专场
直播时间 2025-03-26 14:30:09

开源工业物联实战!
直播时间 2025-03-25 14:30:17

Heygem.ai数字人超4000颗星火燎原!
直播时间 2025-03-13 18:32:35

全栈自研企业级AI平台:Java核心技术×私有化部署实战
目录
所有评论(0)