java高级技术
### Java高级技术——内部类与类加载器 #### 一、内部类概述 在Java编程中,内部类是一个非常强大的特性,它允许开发者在类的内部定义另一个类。这种设计方式不仅增强了代码的封装性,还提高了代码的复用性和灵活性。内部类可以分为两类:成员内部类和局部内部类。 ##### 1. 成员内部类 成员内部类是在外部类的类体内部定义的类,但并不属于任何方法。它们可以直接访问外部类的所有成员变量和方法,即使这些成员是私有的。 **特点**: - **访问权限**:成员内部类可以访问外部类的所有成员,包括私有成员。 - **实例化**:创建成员内部类的对象实例时,必须先有一个外部类的对象实例。 - **静态成员内部类**:如果一个成员内部类被声明为静态(static),那么它就可以不依赖于外部类的对象而被实例化。 **示例**: ```java class Outer { int outer_x = 100; void test() { Inner inner = new Inner(); inner.display(); } class Inner { void display() { System.out.println("display:outer_x=" + outer_x); } } } class InnerClassDemo { public static void main(String args[]) { Outer outer = new Outer(); outer.test(); } } ``` ##### 2. 局部内部类 局部内部类是在方法体内部定义的类,或者是某个局部作用域内的类。与成员内部类不同,局部内部类不能有静态成员,并且不能声明为public、protected或private。 **特点**: - **访问权限**:只能在其定义的方法或作用域内使用。 - **实例化**:同样需要先创建外部类的对象实例。 - **匿名局部类**:局部内部类还可以是匿名的,即没有名字,通常用于实现接口或继承类。 **示例**: ```java public class Parcel4 { public Destination dest(String s) { class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } public static void main(String[] args) { Parcel4 p = new Parcel4(); Destination d = p.dest("Tanzania"); } } ``` #### 二、类加载器 类加载器是Java运行时环境的重要组成部分,它负责将类加载到内存中并创建对应的`Class`对象。Java中有多种类型的类加载器,包括启动类加载器、扩展类加载器、应用类加载器以及自定义类加载器。 **类加载器层次结构**: - **启动类加载器**(Bootstrap ClassLoader):是最顶层的类加载器,用来加载JRE中最核心的类库(如rt.jar)。 - **扩展类加载器**(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader实现,用来加载扩展目录中的jar文件。 - **应用类加载器**(Application ClassLoader):由sun.misc.Launcher$AppClassLoader实现,用来加载应用程序ClassPath路径所指定的类。 - **自定义类加载器**:开发者可以通过继承`java.lang.ClassLoader`来实现自定义的类加载器。 **类加载过程**: 1. **加载**(Loading):找到类的字节码文件,并将其转换成字节流,然后创建`Class`对象。 2. **连接**(Linking):验证类是否符合规范、准备类变量并设置默认值、解析类中的符号引用为直接引用。 3. **初始化**(Initialization):执行类构造器`<clinit>()`,初始化类变量。 **示例**: ```java public class CustomClassLoader extends ClassLoader { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try { String fileName = name.replaceAll("\\.", "/") + ".class"; InputStream is = getClass().getResourceAsStream(fileName); if (is == null) { throw new ClassNotFoundException("Class " + name + " not found."); } byte[] buffer = new byte[is.available()]; is.read(buffer); return defineClass(name, buffer, 0, buffer.length); } catch (IOException e) { throw new ClassNotFoundException(e.getMessage()); } } } ``` #### 总结 内部类和类加载器是Java语言中两个非常重要的概念。内部类提供了一种更加灵活的方式来组织代码,提高了代码的复用性和封装性;类加载器则保证了Java程序能够在不同环境中正确地加载和执行类。理解这些概念对于成为一名优秀的Java开发者至关重要。
剩余49页未读,继续阅读
- 粉丝: 0
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Blynk IOT框架的自动化继电器控制系统.zip
- (源码)基于Qt和SQLite的餐馆管理系统.zip
- (源码)基于Java和Qt的酒店温控计费系统.zip
- (源码)基于Python和PyTorch的个性化人脸评分系统.zip
- (源码)基于Spring Boot和Vue的民商管理系统.zip
- (源码)基于MQTT协议的文件传输系统-TinyMQTT.zip
- 运用python生成的跳跃的爱心
- 基于 Java 实现的 Socket.IO 服务器 实时 Java 框架.zip
- 基于 Ant 的 Java 项目示例.zip
- 各种字符串相似度和距离算法的实现Levenshtein、Jaro-winkler、n-Gram、Q-Gram、Jaccard index、最长公共子序列编辑距离、余弦相似度…….zip