初探JAVA内部类细节一
定义:
可以将一个类的定义放在另一个类的内部 这就是内部类。--摘自java编程思想
一般实现方式:

public class SimpleInnerClass { class Content { private int i; public int getVlaue() { return i; } } class Description { private String lable; Description(String lab) { this.lable = lab; } public String readLable() { return lable; } } public void ship(String lable) { Content content=new Content(); Description description=new Description(lable); System.out.println(description.readLable()); } public static void main(String[] args) { Parcle2 parcle2 = new Parcle2(); parcle2.ship("hi"); } }
上面的事例是最普通不过的内部类表达的例子,通过创建内部类对象的引用访问内部类方法
但一般有更通用的做法,通常是在外围类创建一个方法关联内部类的引用;通过这种方式来建立彼此之间的联系。以代码为例:

public class InnerClass { class Content { private int i; public int getVlaue() { return i; } } class Description { private String lable; Description(String lab) { this.lable = lab; } public String readLable() { return lable; } } public Content getContentInstance() { return new Content(); } public Description getDescriptionIntance(String lable) { return new Description(lable); } public void ship(String lable) { Content content = getContentInstance(); Description description = getDescriptionIntance(lable); System.out.println(description.readLable()); System.out.println(description.readLable()); } public static void main(String[] args) { InnerClass parcle2 = new InnerClass(); parcle2.ship("hi"); InnerClass.Content c = parcle2.getContentInstance();// 如果想在外部类的非静态方法之外的任意位置访问某个内部类的对象,那么必须通过OutClass.xx InnerClass.Description d = parcle2.getDescriptionIntance("hello"); } }
有了联系之后内部类就可以访问外围类的所有元素,无论是private类型也可以。
以下代码即是佐证:

public interface Selector { boolean end(); Object current(); void next(); } public class Sequence { private Object[] items; private int next = 0; public Sequence(int size) { items = new Object[size]; } public void add(Object object) { if (next < items.length) { items[next++] = object; } } class SequenceSelector implements Selector { private int i = 0; @Override public boolean end() { // TODO Auto-generated method stub return i == items.length; } @Override public Object current() { // TODO Auto-generated method stub return items[i]; } @Override public void next() { if (i < items.length) { i++; } } } /** * 内部类对象只有与外围类对象相关联时才能被创建<p> * 构建内部类对象时,需要指向一个其外围类对象的引用;如果编译器访问不到这个引用就会报错 * @return */ public Selector selector() { return new SequenceSelector(); } public static void main(String[] args) { Sequence sequence = new Sequence(5); for (int i = 0; i < 5; i++) { sequence.add(i); } // Sequence.SequenceSelector c=sequence.selector(); Selector selector = sequence.selector(); while (!selector.end()) { System.out.println(selector.current()); selector.next(); } } }
在此,比较初始化的内部类细节介绍完毕,下一章笔者在继续介绍更深一层次的内部类细节
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?