<p>局部类是在<em>块</em>中定义的类,块是在平衡的大括号之间的零个或多个语句组成的。通常,您会在方法体中定义局部类。</p> <p>本节涵盖以下主题:</p> <ul> <li>声明局部类</li> <li>访问外部类成员 <ul> <li>变量屏蔽和局部类</li> </ul></li> <li>局部类类似于内部类</li> </ul> <p>您可以在任何块内定义局部类(有关更多信息,请参见)。例如,您可以在方法体、循环或子句中定义局部类。</p> <p>下面的示例验证两个电话号码。它在方法中定义了局部类:</p> <p>这个例子首先将电话号码中除了数字0到9之外的所有字符都删除,然后检查电话号码是否恰好包含十个数字(北美电话号码的长度)。这个例子输出以下内容:</p> <p>局部类可以访问其外部类的成员。在上一个例子中, 构造函数访问了成员 。</p> <p>此外,局部类可以访问局部变量。然而,局部类只能访问被声明为 final 的局部变量。当局部类访问封闭块的局部变量或参数时,它会将该变量或参数“捕获”。例如, 构造函数可以访问局部变量 ,因为它被声明为 final; 是一个“捕获变量”。</p> <p>然而,从 Java SE 8 开始,局部类可以访问封闭块中的局部变量和参数,只要它们是 final 或者“事实上的 final”。在初始化后其值从未改变的变量或参数被视为“事实上的 final”。例如,假设变量 没有被声明为 final,并且在 构造函数中添加了下面突出显示的赋值语句,将有效电话号码的长度更改为7位:</p> <p>由于这个赋值语句,变量 不再是“事实上的 final”。因此,Java 编译器会生成一个类似于“局部变量引用内部类必须是 final 或者事实上的 final”的错误消息,其中内部类 尝试访问 变量:</p> <p>从 Java SE 8 开始,如果你在方法中声明局部类,它可以访问该方法的参数。例如,在 局部类中定义以下方法:</p> <p>方法 访问了方法 的参数 和 。</p> <p>在局部类中声明一个类型(例如变量)会隐藏与之同名的封闭作用域中的声明。更多信息请参见。</p> <p>局部类与内部类类似,因为它们不能定义或声明任何静态成员。在静态方法中定义的局部类(例如类,定义在静态方法中)只能引用封闭类的静态成员。例如,如果不将成员变量定义为静态的,则Java编译器会生成类似于“无法从静态上下文引用非静态变量”的错误。</p> <p>局部类是非静态的,因为它们可以访问封闭块的实例成员。因此,它们不能包含大多数静态声明。</p> <p>不能在块内声明接口;接口固有是静态的。例如,以下代码段无法编译,因为接口定义在方法的主体内:</p> <p>不能在局部类中声明静态初始化程序或成员接口。以下代码段无法编译,因为方法被声明为。编译器在遇到此方法定义时会生成类似于“修饰符 'static' 仅允许在常量变量声明中使用” 的错误:</p> <p>局部类可以拥有静态成员,前提是它们是常量变量。常量变量是指声明为final并使用编译时常量表达式初始化的原始类型或类型的变量。编译时常量表达式通常是一个字符串或可以在编译时求值的算术表达式。更多信息请参见。以下代码段可以编译,因为静态成员是一个常量变量:</p>
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/5358.html