我有来自 java oracle 文档的以下代码:
公共类 LocalClassExample { 静态字符串正则表达式 = "[^0-9]"; 公共静态无效验证电话号码( 字符串电话号码1,字符串电话号码2){ 最终 int numberLength = 10; // 在 JDK 8 及更高版本中有效: // int numberLength = 10; 类电话号码{ 字符串格式化电话号码 = null; 电话号码(字符串电话号码){ // numberLength = 7; 字符串 currentNumber = phoneNumber.replaceAll( 正则表达式, ””); if (currentNumber.length() == numberLength) 格式化电话号码 = 当前号码; 别的 格式化电话号码 = null; } 公共字符串 getNumber() { 返回格式化的电话号码; } // 在 JDK 8 及更高版本中有效: // public void printOriginalNumbers() { // System.out.println("原来的号码是" + phoneNumber1 + // " 和 " + phoneNumber2); // } } PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); // 在 JDK 8 及更高版本中有效: // myNumber1.printOriginalNumbers(); if (myNumber1.getNumber() == null) System.out.println("第一个数字无效"); 别的 System.out.println("第一个数字是" + myNumber1.getNumber()); if (myNumber2.getNumber() == null) System.out.println("第二个数无效"); 别的 System.out.println("第二个数字是" + myNumber2.getNumber()); } 公共静态无效主(字符串...参数){ validatePhoneNumber("123-456-7890", "456-7890"); } }
局部类是在一个块中定义的类,它是一组在平衡大括号之间的零个或多个语句。您通常会发现在方法体中定义的本地类。
我知道本地类是在块等中定义的类,但我一般不了解它们的用途。
- 你能用它们做什么?
- 它们是类似于 java 匿名类还是不同?
什么是本地班?
根据文档:
本地类在 Java 代码块中本地声明,而不是作为类的成员。通常,本地类在方法内部定义,但也可以在静态初始化程序或类的实例初始化程序内部定义。
因为所有 Java 代码块都出现在类定义中,所以所有本地类都嵌套在它们包含的类中。因此,本地类共享成员类的许多特征。但是,将它们视为完全独立于内部类的类通常更合适。局部类与成员类的关系与局部变量与类实例变量的关系大致相同。
本地类的定义特征是它对代码块是本地的。与局部变量一样,局部类仅在其封闭块定义的范围内有效。
例如,如果成员类仅在其包含类的单个方法中使用,则通常没有理由不能将其编码为本地类而不是成员类。
下面的示例显示了我们如何修改 LinkedStack 类的 enumerate() 方法,以便将 Enumerator 定义为本地类而不是成员类。通过这样做,我们将类定义移动到更接近使用它的位置,并有望进一步提高代码的清晰度。为简洁起见,该示例仅显示方法,而不是包含它
enumerate()
的整个类。LinkedStack
特征
本地班级的特点
本地类具有以下有趣的特性:
与成员类一样,本地类与包含实例相关联,并且可以访问包含类的所有成员,包括私有成员。
除了访问包含类定义的字段外,本地类还可以访问本地方法定义范围内并声明为 final (
final
) 的任何局部变量、方法参数或异常参数。限制
本地课程受以下限制:
本地类仅在定义它的块内可见;永远不能在该块之外使用。
本地类不能声明为 public、protected、private 或 static。这些修饰符适用于类成员;它们不允许与局部变量声明或局部类声明一起使用。
与成员类一样,出于同样的原因,本地类不能包含静态字段、方法或类。唯一的例外是声明为静态和最终的常量。
接口不能在本地定义。
局部类(例如成员类)不能与其任何封闭类同名。
如上所述,局部类可以使用其范围内的局部变量、方法参数甚至异常参数,但前提是这些变量或参数声明为 final。这是因为本地类实例的生命周期可能比定义该类的方法的执行时间长得多。出于这个原因,本地类必须拥有它使用的所有局部变量的私有内部副本(这些副本由编译器自动生成)。确保局部变量和私有副本始终相同的唯一方法是坚持局部变量是最终的。
什么时候使用它们?
Java 文档说以下
有用的网址
类分类
下图显示了 Java 中类的分类:
它们的相似之处在于,在定义它们的代码之外,您无法引用它们。
不同之处在于,对于匿名类,即使在定义它的地方也不能引用它;您只能创建一个实例。
该代码向您展示了一个很好的示例;您创建多个实例
PhoneNumber
并使用该类型定义变量。使用匿名类,您会发现:每个类只能创建一个实例
您不能定义该类的变量,只能使用超类(这意味着,尽管可能,但在匿名类中定义新的公共方法是没有意义的;除非您使用反射,否则您将无法给他们打电话)。
话虽如此,出于可读性的原因,我个人赞成不要滥用匿名类和本地类,对于本地类,我总是更喜欢使用在类级别定义的嵌套类。但这是一个偏好问题。
嵌套类的目的是,为了您理解,一种具有足够复杂性的方法来决定将其转换为类,这样行为是不同的,说了这么多,我回答:
嵌套类只存在于外部类存在的情况下,你不能在不打破壳的情况下制作鸡蛋,这就解释了一切