内部类——局部内部类

来源:互联网 发布:特殊字体生成器软件 编辑:程序博客网 时间:2024/06/06 19:54

局部内部类仅在所在方法内有效,因此不能在方法以外的任何地方使用局部内部类;如果需要使用局部内部类定义变量、创建实例、派生子类,那么都只能在局部内部类所在方法内进行。

局部内部类不能使用访问控制符、static修饰符修饰。


一、静态成员方法中的局部内部类

内部类中可以定义什么?

可以定义任何非静态的成员:普通初始化块、构造方法、实例成员变量、实例成员方法

可以定义的唯一的静态成员:静态常量

不可以定义的静态的成员:静态初始化块、静态成员变量、静态成员方法


外部类访问内部类

局部内部类仅在所在方法内有效,因此不能在方法以外的任何地方使用局部内部类。


内部类访问外部类

我们此处讨论的局部内部类位于静态成员方法中,因为java不允许在静态成员中访问非静态成员,所以此处的局部内部类不能访问外部类的实例成员,只能访问外部类的类成员。


内部类访问所在方法的局部变量(形参、局部变量)

如果仅仅是在局部内部类中使用局部变量(比如参加运算、输出),则没有编译异常;

但是如果修改局部变量的值,则会引发编译异常:“从内部类引用的本地变量必须是最终变量或实际上的最终变量”;

如果把本地变量修改为最终变量就无法修改本地变量的值了。

综上所述,不允许修改本地变量的值,只允许访问本地变量的值。


内部类的继承

如果需要为局部内部类派生子类,则只能在同一个方法内派生;因为子类也是局部内部类、并且与父类在同一个方法中,所以子类必须遵守的规则与父类是相同的。



二、非静态成员方法中的局部内部类

非静态成员方法中的局部内部类与静态成员方法中的局部内部类的唯一区别是:

前者既能访问所在外部类的类成员,又能访问实例成员;

但后者只能访问所在外部类的类成员。



示例代码:

package org.lgy.study.innerclass;/* javac -d classes "src/org/lgy/study/innerclass/LocalInnerClass.java"java org.lgy.study.innerclass.LocalInnerClass*/public class LocalInnerClass{// 外部类的实例成员变量private String nonStaticFieldOuter = "LocalInnerClass : nonstatic field";// 外部类的类成员变量private static String staticFieldOuter = "LocalInnerClass : static field";// 外部类的实例成员方法public void nonStaticMethodOuter(){System.out.println("LocalInnerClass : nonstatic method");}// 外部类的类成员方法public static void staticMethodOuter(){System.out.println("LocalInnerClass : static method");}/* 实例方法中的局部内部类 */public void nonStaticLocalInnerClassMethod(String arg){System.out.println("LocalInnerClass : nonStaticLocalInnerClassMethod start");// 方法中的局部变量final String localVar = "staticLocalInnerClassMethod : localVar";// 局部内部类/* 该内部类位于外部类的实例成员方法中,在实例成员方法中既能访问静态成员,又能访问非静态成员,所以在该局部内部类中也既能访问外部类静态成员,又能访问外部类非静态成员*/class InnerClassBase{// 局部内部类中不能定义静态初始化块/* static{System.out.println("staticLocalInnerClassMethod : static initialize block");} */// 非静态初始化块{System.out.println("staticLocalInnerClassMethod : nonstatic initialize block");// 可以在实例成员方法的局部内部类中访问外部类的实例成员变量System.out.println(nonStaticFieldOuter);System.out.println(LocalInnerClass.staticFieldOuter);// 可以在实例成员方法的局部内部类中访问外部类的实例成员方法nonStaticMethodOuter();LocalInnerClass.staticMethodOuter();// 在局部内部类中访问所在方法的局部变量(形参、局部变量)// arg = "---"; // 不允许修改本地变量的值String str1 = arg + "---"; // 允许使用本地变量的值System.out.println(arg);// localVar = "+++";String str2 = localVar + "+++";System.out.println(localVar);}public InnerClassBase(){}// 局部内部类中不能定义静态成员变量/* private static String staticField = "InnerClassBase : static field"; */// 非静态成员变量private String nonStaticField = "InnerClassBase : nonstatic field";// 局部内部类中不能定义静态成员方法/* public static void staticMethod(){System.out.println("InnerClassBase : static method");} */// 非静态成员方法public void nonStaticMethod(){System.out.println("InnerClassBase : nonstatic method");// 可以在实例成员方法的局部内部类中访问外部类的实例成员变量System.out.println(nonStaticFieldOuter);System.out.println(LocalInnerClass.staticFieldOuter);// 可以在实例成员方法的局部内部类中访问外部类的实例成员方法nonStaticMethodOuter();LocalInnerClass.staticMethodOuter();// 在局部内部类中访问所在方法的局部变量(形参、局部变量)// arg = "---"; // 不允许修改本地变量的值String str1 = arg + "---"; // 允许使用本地变量的值System.out.println(arg);// localVar = "+++";String str2 = localVar + "+++";System.out.println(localVar);}// 局部内部类唯一可以定义的静态成员——静态常量public static final double PI = 3.1415926;}new InnerClassBase().nonStaticMethod();System.out.println("LocalInnerClass : nonStaticLocalInnerClassMethod end");}/* 类方法中的局部内部类 */public static void staticLocalInnerClassMethod(String arg){ // 形参System.out.println("LocalInnerClass : staticLocalInnerClassMethod strat");// 方法中的局部变量final String localVar = "staticLocalInnerClassMethod : localVar";// 局部内部类/* 该内部类位于外部类的类成员方法中,在类成员方法中不能访问实例成员,所以在该局部内部类中也不能访问外部类的实例成员,只能访问外部类的类成员*/class InnerClassBase{// 局部内部类中不能定义静态初始化块/* static{System.out.println("staticLocalInnerClassMethod : static initialize block");} */// 非静态初始化块{System.out.println("staticLocalInnerClassMethod : nonstatic initialize block");// 不能在类方法的局部内部类中访问外部类的实例成员变量/* System.out.println(nonStaticFieldOuter); */System.out.println(LocalInnerClass.staticFieldOuter);// 不能在类方法的局部内部类中访问外部类的实例成员方法/* nonStaticMethodOuter(); */LocalInnerClass.staticMethodOuter();// 在局部内部类中访问所在方法的局部变量(形参、局部变量)// arg = "---"; // 不允许修改本地变量的值String str1 = arg + "---"; // 允许使用本地变量的值System.out.println(arg);// localVar = "+++";String str2 = localVar + "+++";System.out.println(localVar);}public InnerClassBase(){}// 局部内部类中不能定义静态成员变量/* private static String staticField = "InnerClassBase : static field"; */// 非静态成员变量private String nonStaticField = "InnerClassBase : nonstatic field";// 局部内部类中不能定义静态成员方法/* public static void staticMethod(){System.out.println("InnerClassBase : static method");} */// 非静态成员方法public void nonStaticMethod(){System.out.println("InnerClassBase : nonstatic method");// 不能在类方法的局部内部类中访问外部类的实例成员变量/* System.out.println(nonStaticFieldOuter); */System.out.println(LocalInnerClass.staticFieldOuter);// 不能在类方法的局部内部类中访问外部类的实例成员方法/* nonStaticMethodOuter(); */LocalInnerClass.staticMethodOuter();// 在局部内部类中访问所在方法的局部变量(形参、局部变量)// arg = "---"; // 不允许修改本地变量的值String str1 = arg + "---"; // 允许使用本地变量的值System.out.println(arg);// localVar = "+++";String str2 = localVar + "+++";System.out.println(localVar);}// 局部内部类唯一可以定义的静态成员——静态常量public static final double PI = 3.1415926;}new InnerClassBase().nonStaticMethod();System.out.println("LocalInnerClass : staticLocalInnerClassMethod end");}public static void main(String[] args){LocalInnerClass.staticLocalInnerClassMethod("!!!");System.out.println("---------------------------------------------------------------");new LocalInnerClass().nonStaticLocalInnerClassMethod("@@@");}}/* LocalInnerClass : staticLocalInnerClassMethod stratstaticLocalInnerClassMethod : nonstatic initialize blockLocalInnerClass : static fieldLocalInnerClass : static method!!!staticLocalInnerClassMethod : localVarInnerClassBase : nonstatic methodLocalInnerClass : static fieldLocalInnerClass : static method!!!staticLocalInnerClassMethod : localVarLocalInnerClass : staticLocalInnerClassMethod end---------------------------------------------------------------LocalInnerClass : nonStaticLocalInnerClassMethod startstaticLocalInnerClassMethod : nonstatic initialize blockLocalInnerClass : nonstatic fieldLocalInnerClass : static fieldLocalInnerClass : nonstatic methodLocalInnerClass : static method@@@staticLocalInnerClassMethod : localVarInnerClassBase : nonstatic methodLocalInnerClass : nonstatic fieldLocalInnerClass : static fieldLocalInnerClass : nonstatic methodLocalInnerClass : static method@@@staticLocalInnerClassMethod : localVarLocalInnerClass : nonStaticLocalInnerClassMethod end*/




0 0
原创粉丝点击