package org.lgy.study.innerclass;
public class LocalInnerClass{
public static void main(String[] args){
//如果需要在局部内部类中访问所在方法的局部变量,则必须将局部变量声明为final
final int x = 1;
//局部内部类仅在该方法里有效,由于局部内部类不能在外部类的方法以外的地方使用,
//因此局部内部类也不能使用访问控制符和static修饰符修饰。
//如果需要用局部内部类定义变量、创建实例、派生子类,那么都只能在局部内部类所在的方法内进行
class InBase{
//局部内部类中不能定义static成员
//static String str = "123";
private String var = "***";
private void method1(){
System.out.println("method1 in InBase");
}
}
class InSub extends InBase{
private int var = 1;
private void method1(){
System.out.println("method1 in InSub");
}
}
InBase inBase = new InSub();
//即使内部类的成员变量和成员方法是私有的,也可以直接访问
System.out.println(inBase.var);
inBase.method1();
}
}
package org.lgy.study.innerclass;
public class LocalInnerClass{
//method1是外部类的非静态成员方法,当调用method1是已经创建了外部类的对象,
//所以method1中既可以访问外部类的非静态成员,也可以访问外部类的静态成员,
//所以在method1的局部内部类中也既可以访问外部类的非静态成员,也可以访问外部类的静态成员。
public void method1(){
int a = 1;
class Inner1{
//局部内部类中不能定义static成员
//static String str;
public void method1(){
//由于局部内部类所在方法是非静态成员方法,所以可以通过如下方法访问外部类
//的静态成员
LocalInnerClass.method4();
//由于局部内部类所在方法是非静态成员方法,所以可以通过如下方法访问外部类
//的非静态成员
LocalInnerClass.this.method3();
//局部内部类中可以直接访问所在方法中的局部变量,
//无需将局部变量声明为final
System.out.println(a);
}
}
new Inner1().method1();
}
//method2是外部类的静态成员方法,当调用method2时可能没有创建外部类实例,
//所以method2中只能访问外部类的静态成员变量,
//所以在method2的局部内部类中也只能访问外部类的静态成员变量。
public static void method2(){
int a = 1;
class Inner2{
public void method1(){
//由于局部内部类所在的方法是静态成员方法,所以可以通过如下方法访问外部类
//的静态成员
LocalInnerClass.method4();
//由于局部内部类所在的方法是静态成员方法,所以无法访问外部类的非静态成员方法。
//method3();
System.out.println(a);
}
}
new Inner2().method1();
}
private void method3(){
System.out.println("***");
}
private static void method4(){
System.out.println("---");
}
public static void main(String[] args){
new LocalInnerClass().method1();
LocalInnerClass.method2();
}
}
/*
结果:
---
***
---
*/