匿名对象&final

1.1 匿名对象定义&使用
匿名对象即无名对象,直接使用new关键字来创建对象
1.1.1 案例代码九:

package com.itheima_01;
/*
 * 匿名对象:没有名字的对象
 * 匿名对象的应用场景:
 * 当方法只调用一次的时候可以使用匿名对象
 * 可以当作参数进行传递,但是无法在传参之前做其他的事情
 *
 * 注意:匿名对象可以调用成员变量并赋值,但是赋值并没有意义
 *
 */
public class AnonymousObejctDemo {
public static void main(String[] args) {
//Student s = new Student();
//s.study();
//s.study();
//s.study();
//new Student();//匿名对象,没有变量引用的对象
//new Student().study();
//new Student().study();
//new Student().study();
//new Student().age = 18;
//System.out.println(new Student().age);
//Student s = new Student();
//s.age = 18;
//s.name = "张三";
//method(s);
method(new Student());
}
public static void method(Student s) {
}

}

class Student {
String name;
int age;
public void study() {
System.out.println("好好学习,高薪就业");
}
}

1.2 final关键字
final: 修饰符,可以用于修饰类、成员方法和成员变量
final所修饰的类:不能被继承,不能有子类
final所修饰的方法:不能被重写
final所修饰的变量:是不可以修改的,是常量
1.2.1 案例代码十:

   package com.itheima_01;
/*
 * final: 修饰符,可以用于修饰类、成员方法和成员变量
 * final所修饰的类:不能被继承,不能有子类
 * final所修饰的方法:不能被重写
 * final所修饰的变量:是不可以修改的,是常量
 *
 * 常量:
 * 字面值常量:1,2,3
 * 自定义常量:被final所修饰的成员变量,一旦初始化则不可改变
 *
 * 注意:自定义常量必须初始化,可以选择显示初始化或者构造初始化
 *
 * 
 */
public class FinalDemo {
public static void main(String[] args) {
//Animal a = new Animal();
//a.eat();
Dog d = new Dog();
//d.eat();
//d.num = 20;
System.out.println(d.NUM);
}
}

/*final*/ class Animal {
public final void eat() {
System.out.println("吃东西");
}
}

class Dog extends Animal {
/*public void eat() {}*/
final int NUM;
public Dog() {
NUM = 10;
}
}

转载于:https://blog.51cto.com/13587708/2088502

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索局部开发之间实现平衡。文章详细解析了算法的初始化、勘探开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOAMOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
<think>我们正在讨论Java中的匿名对象,但请注意,在Java中更常见的术语是“匿名类”或“匿名内部类”,因为匿名对象通常指的是没有显式赋予变量名的对象实例,而这些实例通常由匿名类创建。因此,问题可以理解为:Java中匿名类的使用方法、示例和适用场景。 根据引用[1][2][3]: - 匿名类的语法:`new 父类或者接口() { /* 重写方法或添加成员 */ }` - 特点:必须继承一个类或实现一个接口,立即实例化,生命周期限于作用域内 - 使用场景:实现接口、临时创建对象、事件监听器等 下面我将详细解释匿名类的使用方法和适用场景。 --- ### Java匿名类的使用方法 1. **基本语法**: ```java new 父类名(构造参数) { // 重写父类方法或添加新方法 }; // 或 new 接口名() { // 实现接口方法 }; ``` 2. **特点**: - **无类名**:匿名类没有显式的类名,因此不能重复使用(即不能在代码中多次实例化)。 - **立即实例化**:创建匿名类的同时就创建了该类的对象。 - **作用域限制**:通常用于方法内部或代码块中,生命周期仅限于该作用域。 - **访问权限**: - 可以访问外部类的成员(包括私有成员)。 - 只能访问所在作用域内声明为`final`或等效`final`(Java 8+)的局部变量。 3. **方法定义**: - 可以重写父类的方法或实现接口的方法。 - 可以添加新的方法和字段,但这些新成员在外部无法直接访问(只能通过重写的方法间接访问)。 --- ### 示例 #### 示例1:实现接口(Runnable) ```java public class AnonymousClassExample { public static void main(String[] args) { // 创建Runnable的匿名实现类对象 Runnable r = new Runnable() { @Override public void run() { System.out.println("Running in an anonymous class!"); } }; Thread thread = new Thread(r); thread.start(); } } ``` #### 示例2:继承父类(Thread) ```java public class ThreadExample { public static void main(String[] args) { // 直接创建Thread的匿名子类对象 Thread thread = new Thread() { @Override public void run() { System.out.println("Thread running anonymously"); } }; thread.start(); } } ``` #### 示例3:事件监听器(GUI编程) 在Swing中,匿名类常用于事件处理: ```java button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); } }); ``` #### 示例4:临时比较器(Comparator) ```java List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); Collections.sort(names, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.length() - s2.length(); } }); ``` #### 示例5:匿名类中添加新方法 ```java Runnable r = new Runnable() { private String message = "Hello"; @Override public void run() { printMessage(); } // 添加新方法(只能在匿名类内部调用) private void printMessage() { System.out.println(message); } }; r.run(); // 输出 "Hello" // r.printMessage(); // 错误:无法访问 ``` --- ### 适用场景 1. **一次性使用**:当某个类的实例只需要使用一次时(如事件监听器、临时线程任务)。 2. **简化代码**:避免为只使用一次的类单独编写类文件,提高代码内聚性。 3. **快速实现回调**:例如在异步编程中实现回调接口。 4. **GUI事件处理**:为按钮、菜单等组件添加事件监听器。 5. **临时实现算法**:如自定义排序规则(Comparator)或条件过滤(Predicate)。 6. **测试桩(Stub)**:在单元测试中快速创建模拟对象。 --- ### 注意事项 1. **可读性**:匿名类可能使代码变长,尤其是实现多个方法时。如果逻辑复杂,建议使用具名内部类或Lambda表达式(Java 8+)。 2. **Lambda替代**:对于只包含单个抽象方法的接口(函数式接口),Java 8之后更推荐使用Lambda表达式: ```java Runnable r = () -> System.out.println("Running with Lambda!"); ``` 3. **内存泄漏风险**:匿名类会隐式持有外部类的引用,在长时间运行的场景中(如静态集合持有匿名对象)可能导致内存泄漏。 --- ### 局部内部类的对比 - **匿名类**:更简洁,无需显式命名,适合极简实现。 - **局部内部类**:可以重复创建多个对象,适合稍复杂的逻辑(引用[3])。 --- ### 总结 匿名类提供了一种快速实例化并实现接口或继承类的便捷方式,特别适用于一次性使用的场景。随着Java 8 Lambda表达式的普及,部分匿名类已被Lambda替代,但在需要实现多个方法或访问外部私有成员时,匿名类仍有其价值。 §§相关问题§§ 1. Java 8 Lambda表达式如何简化匿名类的使用? 2. 匿名局部内部类的主要区别是什么? 3. 在匿名类中访问外部局部变量为什么必须是final或等效final? 4. 匿名类在编译后会生成什么样的类文件? 5. 如何避免匿名类导致的内存泄漏问题?</think>### Java 匿名对象的使用方法、示例和适用场景 在Java中,**匿名对象**指没有显式赋予变量名的对象实例,通常通过匿名类直接创建。这种技术常用于简化代码,特别适合一次性使用的场景。 --- #### 一、基本语法 匿名对象通过 **匿名类 + 直接实例化** 实现: ```java new 父类/接口() { // 重写方法或添加新成员 }; ``` **关键特征**: 1. **无显式类名**:没有正式的类声明 2. **立即实例化**:创建即使用,无法重复引用 3. **作用域限制**:生命周期限于当前代码块 4. **继承/实现要求**:必须继承类或实现接口(引用[1]) --- #### 二、核心使用场景及示例 ##### 1. 实现接口(最常见场景) **场景**:临时实现接口(如Runnable、Comparator),避免创建独立类文件 ```java // 实现Runnable接口创建线程 new Thread(new Runnable() { @Override public void run() { System.out.println("匿名线程运行中"); } }).start(); // 直接调用方法[^2] ``` ##### 2. 事件监听器(GUI编程) **场景**:Swing/JavaFX中的事件处理 ```java button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("按钮被点击"); } }); // 匿名对象作为监听器[^2] ``` ##### 3. 临时比较器(集合操作) **场景**:为排序等操作提供一次性比较逻辑 ```java List<String> names = Arrays.asList("Bob", "Alice", "Tom"); Collections.sort(names, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.length() - s2.length(); // 按长度排序 } }); // 匿名Comparator对象[^3] ``` ##### 4. 重写类方法(继承父类) **场景**:临时修改父类行为 ```java // 创建匿名子类对象 Animal cat = new Animal() { @Override public void sound() { System.out.println("喵喵"); // 重写方法 } }; cat.sound(); // 输出"喵喵" ``` ##### 5. 添加临时功能(扩展对象) **场景**:为对象添加一次性方法 ```java new ArrayList<String>() {{ add("Java"); // 实例初始化块 add("Python"); forEach(System.out::println); // 直接调用方法 }}; // 匿名List对象带自定义逻辑 ``` --- #### 三、适用场景分析 | **场景类型** | **使用原因** | **典型示例** | |----------------------|-----------------------------------------------------------------------------|---------------------------| | **单次功能实现** | 避免创建仅用一次的独立类 | 事件监听器、临时比较器 | | **代码简化** | 减少样板代码,提升可读性 | Lambda前的替代方案 | | **封装局部逻辑** | 逻辑仅需在特定作用域有效 | 方法内部的定制排序 | | **快速原型开发** | 临时测试接口/抽象类的实现 | 单元测试中的Mock对象 | | **资源受限环境** | 减少类文件数量(Android开发常见) | 小型工具类实现 | --- #### 四、重要注意事项 1. **无法重复使用** 匿名对象没有引用变量,创建后无法再次访问: ```java // 正确用法:直接调用方法 new Calculator().add(2, 3); // 错误用法:无法保存引用 // Calculator calc = new Calculator(){...}; ``` 2. **访问限制** 只能访问作用域内的 `final` 或等效 `final` 局部变量(引用[3]): ```java String prefix = "[结果]"; // 等效final new Thread(() -> System.out.println(prefix + data)).start(); ``` 3. **Lambda对比** Java 8+ 中,单方法接口优先用Lambda: ```java // 匿名对象 button.addActionListener(new ActionListener() {...}); // Lambda简化 button.addActionListener(e -> System.out.println("点击")); ``` 4. **编译结果** 匿名类会生成 `外部类$数字.class` 文件(如 `MainClass$1.class`),可能增加类文件数量。 --- #### 五、典型应用案例 **文件过滤器实现**: ```java File dir = new File("."); File[] txtFiles = dir.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.getName().endsWith(".txt"); } }); // 匿名对象完成过滤[^3] ``` **线程池任务提交**: ```java ExecutorService pool = Executors.newFixedThreadPool(2); pool.submit(new Runnable() { @Override public void run() { processData(); // 一次性任务 } }); ``` --- ### 总结 **匿名对象最佳实践**: - ✅ **适用**:单次使用的接口/抽象类实现、事件处理、临时工具对象 - ❌ **避免**:复杂多方法实现、需复用的逻辑、高频创建场景 - ⚠️ **注意**:优先用Lambda简化单方法接口,关注局部变量访问限制 匿名对象通过减少冗余类声明提升代码紧凑性,是Java实现**轻量级多态**和**即用即弃逻辑**的核心技术之一(引用[2])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值