`

本地类

 
阅读更多

 

本地类

本地类指的是定义在一个代码块里的类,代码块指写在一组大括号里的代码。最典型的本地类是定义在方法内部

 

声明本地类

可以在任意代码块内定义一个本地类,比如方法体、for循环、if语句等。

下面是一个例子,LocalClassExample,验证电话号码。这它的方法validatePhoneNumber里定义本地类PhoneNumber

 

 class LocalClassExample {
    static String reg = "[^0-9]";
    public static void main(String[] args) {
         validatePhoneNumber("123-456-7890");
    }

    public static void validatePhoneNumber(String phoneNumber){
        int numberLength = 10;
        class PhoneNumber{
            String formattedPhoneNumber = null;
            PhoneNumber(String phoneNuber){
                String currentNumber = phoneNuber.replaceAll(reg,"");
                if(currentNumber.length() == numberLength)
                    formattedPhoneNumber = currentNumber;
                else
                    formattedPhoneNumber = null;
            }
            public String getNumber(){
                return formattedPhoneNumber;
            }
            public String getOriNum(){
                return phoneNumber;
            }
        }

        PhoneNumber number = new PhoneNumber(phoneNumber);
        if(number.formattedPhoneNumber == null)
            System.out.println("number is invalid");
        else{
            System.out.println("number is "+number.formattedPhoneNumber);
        }
    }
}
结果是:number is 1234567890

 

 

获取外部类的成员

本地类可以获得外部类的成员。上面那个例子中,PhoneNumber构造方法获得了外部类的属性reg

另外本地类可以获得本地变量(本地类所属代码块中定义的变量)。但是它只能使用使用那些被声明为final的本地变量(其实使用非final本地变量不影响代码运行,不过这样容易引起歧义)。

然而,从javase 8以后,本地方法可以使用final或者实际上final的本地变量和外部代码块的参数(比如上面validatePhoneNumber方法的参数phoneNumber)。所谓的实际上final是指这个变量或参数的值在初始化之后就不再发生改变。例如上面例子中的变量numberLength没有声明final,然后在PhoneNumber的构造方法中加上一行代码numberLength = 7;由于这个语句,变量numberLength就不是实际上final。那么,java编译器就会生成一个“local variables referenced from an inner class must be final or effectively final”的错误信息。

javase8之后,如果你在一个方法里定义了本地类,就能获得这个方法的方法参数,比如上面例子中内部类的方法getOriNum()就使用了外部方法validatePhoneNumber的参数phoneNumber

 

本地类与内部类比较

本地类跟内部类很相似,都不能定义或声明任何静态成员。在静态方法中定义的本地类,只能使用外部类的静态成员。比如上面例子中如果reg没有声明为static,那么编译器会生成“non-static variable regularExpression cannot be referenced from a static context."这样的错误信息。

本地类都是非静态的,因为他们要获得外部代码块的实例成员,因此本地类不能包含任何静态声明。(个人认为这是通过编译器审查硬性规定的,因为如果允许声明静态成员,就必须确保这个静态成员跟外部代码块实例成员无关,倒不如一刀切都不许定义为static)

不能再代码块中声明接口。接口天生就是静态的

但是有一个例外,本地类是可以有static成员的,只要他是常量变量(常量变量指被声明为final的基本数据类型或String类型变量,并且它的初始化值必须是编译期常量表达式,编译期常量表达式通常是字符串或者算术表达式这些能在编译器就评估值的。也就是说值是确定的不能用其他变量来给他赋值)

下面代码就是可行的

public void sayGoodbyeInEnglish() {
        class EnglishGoodbye {
            public static final String farewell = "Bye bye";
            public void sayGoodbye() {
                System.out.println(farewell);
            }
        }
        EnglishGoodbye myEnglishGoodbye = new EnglishGoodbye();
        myEnglishGoodbye.sayGoodbye();
    }

 

本地类实现原理

本地类跟内部类一样都会生成一个新的class对象,不同的是新生成的class的构造函数参数除了外部类实例引用外还包括了本地类引用了的外部代码块中的变量,同时本地类多了几个跟这几个引用变量对应的final属性

分享到:
评论

相关推荐

    匿名类/内部类/本地类 解读

    在Java编程语言中,匿名类、内部类和本地类是三种特殊的类定义方式,它们各自具有独特的特性和用途。下面将详细解读这三者之间的差异,并通过实例来帮助理解。 首先,**匿名类**是在没有类名的情况下创建的类,通常...

    PB SQL 缓存数据到本地 类

    标题中的“PB SQL 缓存数据到本地 类”指的是在PowerBuilder(PB)环境中,使用SQL Server(2000或2005版本)数据库的用户,通过编写特定的类来实现将常用数据缓存到本地的Microsoft Access数据库中。这种做法的主要...

    增加本地类重写全局类

    - 在应用本地类后,应该在报表预览中检查格式效果,以确保本地类正确应用且效果符合预期。 - 如果在同一报表中有多个全局类需要重写,可以重复以上步骤,为每个全局类创建对应的本地类。 通过上述知识点,可以帮助...

    PHP下载远程图片保存到本地类.zip

    这个“PHP下载远程图片保存到本地类”提供了一个高效的解决方案,它封装了整个过程,包括错误处理、超时控制以及路径管理等关键点。 首先,让我们了解类的基本结构。一个PHP类可能包含以下组件: 1. **构造函数**...

    PHP下载远程图片到本地类

    本篇将详细介绍如何使用PHP实现这一功能,以及提供的"PHP下载远程图片到本地类"的使用方法。 首先,我们需要理解HTTP协议的基本原理,它是互联网上应用最为广泛的一种网络协议,用于传输超文本信息。当我们想要下载...

    PHP下载远程图片到本地类.zip

    "PHP下载远程图片到本地类.zip"提供的功能正满足了这一需求。这个压缩包包含了一个名为"PHP下载远程图片到本地类.php"的文件,这是一个专门用于下载远程图片的PHP类库,它可以方便地抓取互联网上的图片并将其保存到...

    PHPMPS内核本地分类信息网站源码 支持手机版

    二次开发的一套分类信息源码,支持二开,支持手机版,页面也还可以简单大气适合本地人发布信息之类的。 内附安装说明 安装简易说明: 上传 → 安装 → 进入后台 → 恢复数据 → 修改cookie记录值(第3点有说明) ...

    webservice生成本地类所用的jar包

    标题中的“webservice生成本地类所用的jar包”指的是Apache CXF提供的一种功能,即通过CXF的工具将Web服务的WSDL描述转换为Java本地类。这些本地类可以帮助开发者在Java应用中方便地调用和实现Web服务。生成的本地类...

    可以二开的地方分类信息程序源码下载本地分类信息源码.zip

    这是给客户二次开发的一套分类信息源码,支持二开,客户已经运营了将近两年了,支持手机版,页面也还可以简单大气适合本地人发布信息之类的。 现在分享出来喜欢的下载运营也可以自己开次开发一下。

    信息分类信息网站源码带数据 同城门户网站模板 本地生活信息服务平台二手租房物品交易

    本地信息分类发布,同城本地发布网站等应用场景;还可用于申请ICP相关使用,申请如需网站的安装、修改、定制服务请联系在线客服。本网站功能强大,注册、发布、置顶、会员系统、发布新闻、商家入住等等;

    WebServiceStudio抓取WebService接口生成静态cs类文件 可以将远程地址的webservice接口生成本地

    在描述中提到,“抓取WebService接口生成本地类文件,进行开发调试工作”,这表明WebServiceStudio的主要功能是为开发和调试提供便利。通过生成的静态类,开发者可以在本地进行单元测试,调试代码逻辑,而不必每次都...

    android保存log到本地的工具类

    本篇将详细讲解一个简单的Android工具类,用于打印并保存日志到本地。 一、Android日志系统简介 Android系统提供了一个内置的日志框架,允许开发者通过`Log`类输出不同级别的日志信息,如`VERBOSE`、`DEBUG`、`INFO...

    c# 完整本地缓存类

    WriteCache方法: 用Dictionary, Dictionary, byte[]>替代Cache类 数据库名+表名 为缓存KEY SQL语句为缓存键值的key 查询结果序列化为缓存键值的Values 序列化后加密保存在本地供调用 ReadCache方法:解密后反序列...

    java本地缓存ConcurrentHashMap

    java本地缓存ConcurrentHashMap

    解决intellj idea maven找不到程序包和类的方法

    解决intellj idea maven找不到程序包和类的方法,正确的解决方式

    C#与C++混合编程.pdf

    首先,需要准备用于导出的C++本地类和函数。这通常涉及到创建一个Win32的C++项目,并在这个项目中编写相应的C++类和函数。比如,创建一个C函数`intAdd(int a, int b)`用于计算两个整数的和,并且创建一个本地C++类`...

    图片本地缓存工具类

    图片本地缓存工具类可以直接使用,对于图片的压缩,缓存,调用,缓存清理等。

    webshpere classloader 原理

    - PARENT_FIRST:先将搜索委托给父类加载器,然后再尝试从本地类加载器加载类。 - PARENT_LAST:先查看本地类加载器,再搜索父类加载器。 #### 三、不同类加载器详情与选项 在WebSphere Application Server v6中...

    详解IDEA使用Maven项目不能加入本地Jar包的解决方法

    3. 针对部署时的类找不到问题,需要在IDEA的`Project Structure`中设置`Artifacts`。在`WEB-INF`目录下新建`lib`目录,并将相关依赖库添加进去。这将确保在构建WAR包时,这些库会被包含在`WEB-INF/lib`下。 4. 如果...

    php下载远程文件到本地存储的函数类.zip

    在实际使用这个函数类时,我们需要按照其提供的文档或示例代码来调用相关方法,传入必要的参数,如远程文件URL、本地保存路径等。同时,根据项目的具体需求,可能还需要考虑如何处理并发下载、多线程、下载限速等...

Global site tag (gtag.js) - Google Analytics