小议局部类 (内部类, Inner Class)

三轴加速度传感器计步算法优化:动态阈值与滤波技术的实践应用 本文深入探讨了三轴加速度传感器计步算法的优化实践,重点分析了动态阈值调整与高效滤波技术如何协同提升计步精度与鲁棒性。通过对比均值滤波的局限,引入向量模长计算、多级自适应阈值以及状态机判决逻辑,并结合代码示例,为嵌入式及移动应用开发者提供了应对复杂运动场景的实用解决方案。 阅读详情

2003年6月发于 CCW-I
2006年9月搬至 优快云

  假如你有一个 Integer 对象的列表,并且你想使用 Coolections.sort 来对它们进行排序。另外,你还要自己指定一个比较器,因为你想按降序而不是升序排列它们。这里有一些代码示例说明了该怎么做:

import java.util.*;

public class LocalDemo1 {

    
// 使用实现了 Comparator 的匿名类排序。

    
static void sortanon(List list) {
        Collections.sort(list, 
new Comparator() {
            
public int compare(
               Object o1, Object o2) 
{
                 
int cc = ((Integer)o1).compareTo(o2);
                 
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }
);
    }


    
//  使用实现了 Comparator 的局部类排序

    
static void sortlocal(List list) {
        
class MyComparator implements Comparator {
            
public int compare(
               Object o1, Object o2) 
{
                 
int cc = ((Integer)o1).compareTo(o2);
                 
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }
;

        Collections.sort(list, 
new MyComparator());
    }


    
public static void main(String[] args) {
        List list1 
= new ArrayList();
        list1.add(
new Integer(1));
        list1.add(
new Integer(2));
        list1.add(
new Integer(3));
        sortanon(list1);
        System.out.println(list1);

        List list2 
= new ArrayList();
        list2.add(
new Integer(1));
        list2.add(
new Integer(2));
        list2.add(
new Integer(3));
        sortlocal(list2);
        System.out.println(list2);
    }

}

  这段程序的输出如下:

[3, 2, 1]
[3, 2, 1]

  上列中使用两种不同的方法实现了 Comparator 接口。第一种方法使用匿名类,第二种方法使用局部类,二者有何区别:

  一点区别是格式上的——匿名类的定义比较简捷,它实际上是下面这个表达式的一部分:

Comparator c = new Comparator() {...};

  与之相反,局部类的定义看起来非常类似于常规的类定义,略为烦琐。例如,定义局部类内时可能用到 “implements”语句,而在匿名类中不需要显示的使用这条语句。

  哪一种格式“更好”取决于你自己的观点。匿名类的定义会比较难读,但在不需要使用局部类的地方使用局部类会造成一些错觉,让人觉得需要做的事比实际要做的事更多。

  让我们来看看另一个例子,更深层的比较匿名类和局部类:

import java.util.*;

public class LocalDemo2 {

    
// 使用两个单独的匿名类实例对两个列表进行排序

    
static void sort1(List list1, List list2) {
        Collections.sort(list1, 
new Comparator() {
            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }
);

        Collections.sort(list2, 
new Comparator() {
            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }
);
    }


    
// 使用一个局部类的两个实例来对两个列表进行排序

    
static void sort2(List list1, List list2) {
        
class MyComparator implements Comparator {
            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }


        Collections.sort(list1, 
new MyComparator());
        Collections.sort(list2, 
new MyComparator());
    }


    
// 使用一个匿名类的一个实例来对两个列表进行排序 

    
static void sort3(List list1, List list2) {
        Comparator cmp 
= new Comparator() {
            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }
;

        Collections.sort(list1, cmp);
        Collections.sort(list2, cmp);
    }


    
// 使用一个局部类的一个实例来对两个列表进行排序

    
static void sort4(List list1, List list2) {
        
class MyComparator implements Comparator {
            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }

        }


        Comparator cmp 
= new MyComparator();

        Collections.sort(list1, cmp);
        Collections.sort(list2, cmp);
    }


    
static class AppComparator implements 
     Comparator 
{
        
public int compare(Object o1, Object o2) {
            
int cc = ((Integer)o1).compareTo(o2);
            
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
        }

    }


    
static Comparator appcomparator = 
       
new AppComparator();

    
// 使用应用程序中定义的比较器来对两个列表进行排序

    
static void sort5(List list1, List list2) {
        Collections.sort(list1, appcomparator);
        Collections.sort(list2, appcomparator);
    }


    
public static void main(String[] args) {
        List list1 
= new ArrayList();
        list1.add(
new Integer(1));
        list1.add(
new Integer(2));
        list1.add(
new Integer(3));

        List list2 
= new ArrayList();
        list2.add(
new Integer(4));
        list2.add(
new Integer(5));
        list2.add(
new Integer(6));

        
//sort1(list1, list2);
        
//sort2(list1, list2);
        
//sort3(list1, list2);
        
//sort4(list1, list2);
        sort5(list1, list2);

        System.out.println(list1);
        System.out.println(list2);
    }

}

  输出结果是:

[3, 2, 1]
[6, 5, 4]

  程序中所有这些排序的方法都做同样的事情——降序排序两个列表中的 Integer 对象。

  sort1 使用两个匿名类,每个都实现了 Comparator 接口。这两个类是相对独立的,但在逻辑上是重复的 (这样的代码非常糟糕)。

  sort2 方法使用了一个局部类的两个实例。这是比 sort1 更好的方法,但这并不是最有效率的。

  sort3 和 sort4 方法分均是使用的一个类的一个实例,它们在逻辑上也没有重复,所以是比较有效率的代码。这两段代码也有不同之处:sort3 比 sort4 更简捷,但 sort4 更具可读性。除了可读性,在这种情况下使用局部类没有更多的意义。

  如果你需要在一个应用程序中使用同一种排序的策略,那么上述的四种方法都不是完全正确的。这种情况下,最好使用一个全局类或者内部类 (MyComparator),或者创建一个单独的可用于应用程序中任何地方的比较器实例。sort5 就是这种情况下的例子。

  关于匿名类的另一个问题是它们必须基于一个已经存在的类或者接口创建,例如,你使用下面这句代码的时候:

Comparator c = new Comparator() {...};

实际上发生的事情是:从一个没有名字的类创建了实例,而这个类实现了 Comparator 接口。而对于局部类则没有这种限制。

  匿名类和局部类更深层次的区别在于:匿名类不能定义构造器,因为它是没有名字的。不过它还是可以通过 {...} 格式的初始化代码块做一些简单的初始化,例如:

import java.util.*;

public class LocalDemo3 {
    
public static void main(String[] args) {
        Comparator cmp1 
= new Comparator() {
            
{
                System.out.println(
                   
<object initialization>);
            }


            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }
;
        }
;

        
class MyComparator implements Comparator {
            
public MyComparator(int x) {
                System.out.println(
                   
<constructor called> +
                   
< with value > + x);
            }


            
public int compare(
              Object o1, Object o2) 
{
                
int cc = ((Integer)o1).compareTo(o2);
                
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
            }
;
        }
;
        Comparator cmp2 
= new MyComparator(100);
    }

}

这段程序将输出:

    object initialization
    constructor called with value 100

  局部类可以拥有通过常规方法使用的构造器,而匿名类地必须通过 {...} 来实现初始化。

  再次考虑关于对例表进行排序的例子。为局部类或内部类定义一个构造器,并通过传递参数的办法可以指定这个类的实例在操作过程中是按升序还是降序。在匿名类中要做到这一点则需要定义一个类成员级别的 final 变量。

  在对类的主流应用中更适合使用局部类,因为你更熟悉。局部类也比匿名类更具可读性。同时,局部类的功能往往会超出你所需要的,那么这个时候,就更适合使用匿名类了。

mysql8.0安装及配置超详细教程_mysql-8.0.15-winx64 MySQL8.0配置教程, 全网最详,同时有本地mysql和小皮系统见另一篇 阅读详情

相关推荐

WSL 相关命令时遇到了 “无法从raw.githubusercontent.com提取分发列表、操作超时

核心问题:国内网络屏蔽raw.githubusercontent.com,导致WSL无法获取发行版列表;最优方案:优先用方案1(手动指定发行版安装),无需改配置,1分钟搞定;永久修复:用方案2(修改hosts),适合需要管理多个WSL发行版的场景;兜底方案:用方案3(手动下载安装包),适配所有网络环境。按以上步骤操作后,你不仅能正常安装WSL,等命令也能正常执行,后续可正常使用WSL搭配Docker Desktop(如切换WSL 2后端),无需再担心网络超时问题。

weixin_39766667的博客 2115

c++ 语言学习 day04 (使用 QT c++ 编译器)继承, .多继承 ,内部类,局部类,构造函数的相互调用,多态,虚函数:

c++ 语言学习 day04 (使用 QT c++ 编译器)继承, .多继承 ,内部类,局部类,构造函数的相互调用,多态,虚函数:

she666666的博客 1864

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

基于UG585详细讲解其中TTC的原理和使用案例。

Alex的技术博客 7886

Qt中的类

一.信号与槽 1.QT元对象系统 QT元对象系统提供三件事情: 1.QObject类 2.Q_OBJECT 宏,声明在类私有段中 3.moc编译器:为每个Qobject子类对象生成实现元对象特性(如信号槽)的代码。 moc读入c++源文件,若发现存在Q_OBJECT 宏的对象,就会将这个宏展 开生成moc文件,包含元对象实现的代码。 2.connect 函数 QMetaObject::Connection QObject::connect(const QObject *sender, con

weixin_50260670的博客 2584

AS5600磁编码器IIC通信与角度读取实战指南

本文提供了AS5600磁编码器通过IIC通信协议实现高精度角度读取的完整实战指南。详细解析了硬件连接要点、IIC通信时序、Arduino与STM32平台驱动代码,并分享了多圈测量、噪声滤波等进阶应用与避坑技巧,帮助开发者快速将这款非接触式角度传感器集成到电机控制、旋钮等项目中。

weixin_29172201的博客 242

python 编程 安卓脚本_详解基于Android的Appium+Python自动化脚本编写

1.AppiumAppium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序。通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码。下面开始Appium的配置。appPackage和APPActivity的获取任意下载一个app解压...

weixin_39523625的博客 2928

五、Qt中的常用类

QString是Qt中的字符串类,与C/C++不同的是,不再使用ASCII编码,而使用编码。因此一个字符不是8位的char,而是16位的QChar,这就是为什么之前一个汉字占用一个字符的原因。QString几乎向前兼容所有std::string的API。

weixin_43624626的博客 870

寻路最终版哦

相信大家用unity3d寻路的时候,一定会碰到多人

yxriyin的专栏 6953

【Java学习笔记(五)】之内部类的要点介绍

本文章由公号【开发小鸽】发布!欢迎关注!!! 老规矩–妹妹镇楼: 一. 内部类 (一)定义        在一个类中定义一个类,如:在类A中定义一个类B,则该类B就称为内部类。 格式: class 外部类名{ 修饰符 class 内部类名{ } } (二)特点 内部类可以直接访问外部类的成员,包括私有的外部类成员变量 外部类要访问内部类的成员,必须在外部类中创建内部类对象,通过内部类对

开发小鸽 300

详解AUTOSAR:AUTOSAR架构中的配置文件(拓展篇—7)

查看AUTOSAR代码包时会发现一些这样格式的文件:xxx_PBcfg.c、xxx_Lcfg.c和xxx_Cfg.h,本篇博文讲一讲这几个配置文件的作用和特点。

不脱发的程序猿 2146

【Charge】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.01.20\textrm{Created Time: 2026.01.20}Created Time: 2026.01.20 Modified Time: 2026.01.20\textrm{Modified Time: 2026.01.20}Modified Time: 2026.01.20工作流程材料模型[Charge] 电荷分布与折射率变化理论 [Charge] FDTD

u011699626的博客 312

Qt:核心内部

Qt包含一组丰富的启动器,主要来自Qt核心模块。Qt使用这些启动器来提供更高级别的UI和应用程序开发组件。下面的主题解释了最重要的启动器,并展示了如何使用它们来实现Qt尚未提供的专用功能 对象、属性和事件 QObject类是Qt对象模型的基础,是很多Qt类的父类。对象模型引入了很多机制,比如元对象系统,它允许运行时内声明,操作和调用对象中的属性和方法。它还作为Qt事件系统的基础。Qt事件系统是一种基于QObject的对象之间进行通信的低级方式。Qt的信号和槽机制提供了另一种高级通信方式 此外,QObject

OceanStar的博客 511

实现敌人跟随玩家。(Unity)

首先和玩家设置一模一样,给敌人添加一个刚体,设置一个碰撞器,并设置一个触发器。然后在对场景里面的组件添加导航网格代理并且进行bake烘焙,那样的话敌人就可以在进行烘焙的位置进行移动。创建脚本,并且挂载脚本到敌人的组件上,用代码进行实现效果,并且要挂载目标对象。

weixin_57813136的博客 1867

内部类、异常类、异常类

我们已经知道,类可以有两种重要成员:成员变量和方法,实际上,Java还允许类可以又一种成员:内部类。 Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的类称为内部类的外嵌类。 内部类和外嵌类之间的重要关系如下: 1、内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。 2、内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声

Wlain的博客 1671

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

内部类和匿名类

2.内部类和匿名类 2.1内部类  内部类主要分为:定义在方法体外的成员内部类和定义在方法体内的内部类。定义在方法体内的内部类,又可以分为有实例名称的内部类和无实例名称的内部类 使用内部类的主要原因有以下4个: l  内部类对象能够访问其所在外部类的全部属性,包括私有属性; l  内部类能够隐藏起来,不被同一包中的其他类所见; l  匿名内部类可以方便地定义运行时回调; l  使用内

Bruce Lee的专栏 797

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++ 内部类(嵌套类)

内部类 内部类就像这个类的一个成员函数,所以内部类有权访问外部类内容(包括private内容)。但是内部类就相当于在一个作用域内定义了一个类,这个作用域内的其他变量是无权访问这个类的。 class Out{ public : void Fun () { nested object; // 这个函数不能通过 object.b_ = 1; } priv...

我喜欢雨天的清新的博客 7876

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java系列之内部类

今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类、成员内部类、匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下: 概述 静态内部类 成员内部类 匿名内部类和方法内部类 总结 概述 顾名思义内部类就是在一个类内部定义的类,它是内部类是一个独立的类,编译之后会生成独立的 .class 文件,其名称前面会...

weixin_34407348的博客 125

Qt所有的类

QAccel 处理键盘加速器和快捷键 Handles keyboard accelerator and shortcut keys QAccessible Enums与可达性的静态函数 Enums and static functions relating to accessibility QAccessibleInterface 定义一个接口,该接口公开有关...

future_ai的博客 3971

C++内部类和外部类的互相访问(d指针和q指针)

d指针和q指针式Qt中常见的封装方法,由此引出了C++内部类和外部类的互相访问。 其实也是Pimpl(pointer to implementation, 指向实现的指针)方法。 实验代码: Inner类为Outter类的私有内部类。Inner类中有一个public字符串变量In,Outter类中有一个private字符串变量Out。通过Outter类中的d指针访问Inner类,实现对In的读写;...

随便写写 3655

实现私有化(Pimpl) --- QT常见的设计模式

转载自:http://blog.sina.com.cn/s/blog_667102dd0100wxbi.html 一、遇到的问题 1.隐藏实现 我们在给客户端提供接口的时候只希望能暴露它的接口,而隐藏它的实现或者算法。这时候,至少至少有两种选择: (1)写一个抽象类, 然后继承它 (2)使用PIMPL, 把实现放到内部公有的文件里,而对外部隐藏起来   2

zgrjkflmkyc的专栏 4560

Qt5的插件机制(5)--QLibrary类与QPluginLoader类

前面几片文章中提到的类,包括 QxxxFactory、QFactoryLoader、QLibraryPrivate 等, 都是Qt的内部类,不是Qt的标准API, 如果要在应用程序的层次上加载库或插件,则需要借助另外两个类,QLibrary 和 QPluginLoader,这两个类属于Qt的标准API,可以 在普通Qt应用程序的开发中使用。 这两个类的用法比较简单,可以在 Qt Assi

NewThinker_wei 的专栏 9731

C++嵌套类与内部类

————————————————–先从定义上来区分————————————————– 嵌套类       所谓嵌套类就是可以在一个类中定义另一个类。这个被嵌套的类的作用域就只在它的上一级类中。       外围类需要使用嵌套类对象作为底层实现,并且该嵌套类值用于外围类的实现,且同时可以对用户隐藏该底层实现       从作用域的角度看,嵌套类别隐藏在外围类之中,该类名只能在外围类中使用。如果

yrc_Note的博客 5479

内部类的定义和使用

对于内部类的定义使用暂时不作为首要类设计原则。

mrbacker的博客 2536
上一篇: java.util.StirngTokenizer 示例代码
下一篇: 带标签的 break 和 continue (Java)
边城狂人
博客等级 码龄23年 139粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值