20220812-Java内部类
跟老韩学完了java面向对象的高级篇,老师提到了卖油翁和老黄牛的故事,在学习Java的路上,借以自勉,“我亦无他,唯手熟尔”,天道酬勤,长路漫漫,少年加油,未来可期~
今晚对学习到的内部类进行知识总结。
!!匿名内部类比较关键,注意使用方法
目录
一、内部类概念
内部类:在一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他类的类称为外部类。
至此,类的五大成员全部接触过了:
- 属性Field
- 方法Method
- 构造器Constructor
- 代码块Code Block
- 内部类Inner Class
二、内部类分类
1. 局部内部类
1.1 代码示例
public class ParameterInnerClass { public static void main(String[] args) { Outer01 outer01 = new Outer01(); outer01.f(); } } class Outer01 { private int age = 10; //1. 成员方法内部的局部内部类 public void f() { class Inner01 { int age = 20; public void m() { //内部类中可以直接调用父类中的成员 //当内部类与外部类存在相同名称的变量时,遵循就近原则 //调用父类成员时需要使用:外部类.this.变量名; System.out.println(age); System.out.println(Outer01.this.age); } } Inner01 inner01 = new Inner01(); inner01.m(); } //2. 代码块内部的局部内部类 { class Inner02 { int age = 20; public void m() { System.out.println(age); System.out.println(Outer01.this.age); } } Inner02 inner02 = new Inner02(); inner02.m(); } }
1.2 使用细节
- 局部内部类中可以直接访问外部类的所有成员,包含私有成员;
- 局部内部类不能添加访问修饰符,因为它的地位就是一个局部变量,但是可以使用final修饰;
- 作用域:在定义它的方法或者代码块中;
- 局部内部类—访问—外部类的成员(访问方式:直接访问);
- 外部类—访问—局部内部类的成员(访问方式:创建内部类对象,通过对象访问);
- 外部其他类无法访问局部内部类;
- 外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,使用(外部类名.this.成员)去访问。
2. 匿名内部类!!!重要
2.1 代码示例
public class AnonymousInnerClass { public static void main(String[] args) { Outer02 outer02 = new Outer02(); outer02.f(); } } class Outer02 { private int age = 10; //1. 成员方法中的匿名内部类 public void f() { IF01 a = new IF01() { @Override public void m() { System.out.println("方法中匿名内部类f()...age=" + age + " " + this.getClass()); } }; a.m(); A b = new A() { @Override public void n() { System.out.println("方法中匿名内部类n()...age=" + age + " " + this.getClass()); } }; b.n(); } //2. 代码块中的匿名内部类 { new IF01() { @Override public void m() { System.out.println("代码块中匿名内部类f()...age=" + age); } }; new A() { @Override public void n() { System.out.println("代码块中匿名内部类n()...age=" + age); } }; } } interface IF01 { public void m(); } class A { public void n() { System.out.println("A n()..."); } }
2.2 使用细节
- 本质是类;内部类;该类没有名字;同时是一个对象;
- 匿名内部类即使一个类的定义,本是也是一个对象,它既有定义类的特征,也有创建对象的特征;
- 可以访问外部类的所有成员,包含私有的;
- 不能添加访问修饰符,因为他的地位就是一个局部变量;
- 作用域:方法体中或者代码块中;
- 匿名内部类—访问—外部类成员(访问方式:直接访问);
3. 成员内部类
3.1 代码示例
public class MemberInnerClass { public static void main(String[] args) { Outer03 o1 = new Outer03(); o1.m(); //外部其他类访问成员内部类的方式 //1. 方式1 Outer03.Inner03 i1 = o1.new Inner03(); //2. 方式2 Outer03.Inner03 i2 = new Outer03().new Inner03(); //3. 方式3 Outer03.Inner03 i3 = o1.getInnerInstance(); } } class Outer03 { private int age = 10; //成员内部类 class Inner03 { public void f() { //成员内部类中可以直接访问外部类成员,包括私有成员 System.out.println("age=" + age); } } // 方法:创建内部类对象,并访问内部类成员 public void m() { //外部类通过创建内部类对象访问内部类成员 Inner03 inner03 = new Inner03(); inner03.f(); } // 方法:返回内部类对象 public Inner03 getInnerInstance() { return new Inner03(); } }
3.2 使用细节
- 成员内部类可以定义在外部类的成员位置,并且没有static修饰
- 可以直接访问外部类的所有成员,包含私有的
- 可以添加任意访问修饰符,因为它的地位是成员
- 作用域:与外部类其他成员一样,为整个类体
- 成员内部类—访问-外部类成员(访问方式:直接访问)
- 外部类成员—访问—内部类(访问方式:创建成员内部类的对象,再访问)
- 外部其他类—访问—内部类(访问方式:创建外部类对象,通过外部类对象来创建内部类对象)
4. 静态内部类
4.1 代码示例
public class StaticInnerClass { public static void main(String[] args) { //外部其他类访问静态内部类 //方式1 Outer04.Inner04 inner04 = new Outer04.Inner04(); //方式2 Outer04.Inner04 innerInstance = Outer04.getInnerInstance(); } } class Outer04 { private int age = 10; public static String name = "A"; //静态内部类 static class Inner04 { public void f() { //静态内部类中不能访问外部类非静态属性 //System.out.println("age = "+age); System.out.println("name = " + name); } } //方法:创建静态内部类对象,并访问其成员 public void m() { Inner04 inner04 = new Inner04(); inner04.f(); } public static Inner04 getInnerInstance() { return new Inner04(); } }
4.2 使用细节
- 静态内部类定义在外部类的成员位置,并且有static修饰
- 可以直接访问外部类的所有静态成员,包含私有的,但不可以访问非静态成员
- 可以添加任意访问修饰符
- 作用域:整个类体
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具