当前位置: 首页 > news >正文

Java 内部类

Java内部类

Java内部类是定义在另一个类里面的类。根据其定义和作用域,内部类主要可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。

分类

  1. 成员内部类:定义在类的成员位置,可以像成员变量一样进行访问控制(private、protected、public)。成员内部类可以无条件访问外部类的所有成员。

  2. 局部内部类:定义在方法中的类,只在该方法内部可见,类似于方法内的局部变量。它们对外完全隐藏。

  3. 匿名内部类:没有名字的局部内部类,适用于那些只需要使用一次的类。通常用于接口或抽象类的实例化。

  4. 静态内部类:使用static修饰的内部类,不需要依赖外部类的实例,不能访问外部类的非static成员。

特点

  • 内部类提供了更好的封装,可以将内部类隐藏在外部类之内,不允许外界直接访问。
  • 内部类可以直接访问外部类的成员,包括私有成员。
  • 创建成员内部类的对象时,必须先有外部类的对象。

优缺点

优点

  • 更好的封装性,可以将内部类隐藏在外部类之内,减少了类的数量。
  • 内部类可以直接访问外部类的成员,提高了代码的可读性和重用性。

缺点

  • 增加了类的复杂性,使用不当会使得代码结构混乱。
  • 可能会引入额外的内存开销和性能开销。

示例

成员内部类示例

public class Outer {private int num = 10;public class Inner {public void display() {System.out.println("num = " + num);}}public void createInner() {Inner inner = new Inner();inner.display();}
}

静态内部类示例

public class Outer {private static int num = 10;public static class Inner {public void display() {System.out.println("num = " + num);}}
}

局部内部类示例

public class Outer {public void display() {class Inner {public void show() {System.out.println("Hello, Inner");}}Inner inner = new Inner();inner.show();}
}

匿名内部类示例

public class Outer {public void createThread() {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("匿名内部类创建的线程");}}).start();}
}

内部类是Java语言的一个强大特性,它允许更灵活地组织和封装复杂的类结构。正确使用内部类可以使代码更加简洁、易于维护。

Java 内部类可以访问外部类的原理

Java内部类可以访问外部类成员的原理基于Java编译器的特殊处理。当一个内部类被编译时,Java编译器会隐式地处理内部类和外部类之间的关系,确保内部类可以访问外部类的成员,包括私有成员。这是通过以下几个步骤实现的:

1. 引用外部类的实例

对于非静态内部类(成员内部类和匿名内部类),Java编译器会自动为内部类添加一个外部类实例的引用。这个引用的名称通常是this$0。这意味着,当创建内部类的实例时,它会隐式地持有一个对外部类实例的引用。通过这个引用,内部类可以访问外部类的实例成员。

2. 生成访问方法

当内部类需要访问外部类的私有成员时,Java编译器会在外部类中生成一些特殊的访问方法(通常是私有的和静态的)。这些方法提供了一种方式来访问外部类的私有成员。内部类实际上是通过调用这些访问方法来访问外部类的私有成员的。

3. 修改内部类的构造函数

对于成员内部类,Java编译器会修改其构造函数,加入一个外部类实例的参数。这样,当创建内部类的实例时,就会传递一个外部类的实例给内部类,从而使内部类能够通过这个实例访问外部类的成员。

示例

考虑以下代码:

public class Outer {private int num = 10;public class Inner {public void display() {System.out.println("num = " + num);}}
}

编译后,大致相当于以下形式(简化版):

public class Outer {private int num = 10;private static int access$000(Outer outer) {return outer.num;}public class Inner {final Outer this$0;Inner(Outer outer) {this$0 = outer;}public void display() {System.out.println("num = " + Outer.access$000(this$0));}}
}

通过这种方式,Java确保了内部类可以访问外部类的成员,包括私有成员。这种机制是Java语言的一部分,由编译器自动处理,对于Java开发者来说是透明的。


http://www.mrgr.cn/news/8440.html

相关文章:

  • 探索Swift的精髓:玩转Swift标准库
  • Linux 内核源码分析---netfilter 框架
  • Java | Leetcode Java题解之第355题设计推特
  • 靠近光,学习光,成为光
  • m4a格式音频怎么转成mp3?音频转成mp3的8个方法
  • 基于Spark实现大数据量的Node2Vec
  • 【非常简单】 猿人学web第一届 第12题 入门级js
  • http连接未释放导致生产故障
  • 【模板方法】设计模式:构建可扩展软件的基石
  • JetBrains Rider 2024.2 (macOS, Linux, Windows) - 快速且强大的跨平台 .NET IDE
  • SpringCache源码解析(一)
  • 使用 Tailwind CSS 实现水平和垂直居中对齐的方法
  • 【学习笔记】NTN技术整理
  • Objective-C 动态调用秘籍:NSInvocation 的魔法
  • Mako 模板语言
  • (南京观海微电子)——直流电源使用介绍
  • 基于Python的网易民谣歌词数据分析的设计与实现
  • 广州网站制作seo优化技巧
  • C语言01 每日一练01
  • 模型 FIRE沟通法