标签:
public class Main { /** * 内部类分为:成员内部类、方法内部类、匿名内部类、静态嵌套类 * * 公共特性: * 1、内部类是一个独立的类编译后有class文件,但是前面冠以外部类的类名和$符号。 * 2、内部类是外部类的成员,所以可以随便访问外部类的成员,包括private。 * 3、内部类是静态的话,只能访问外部类的静态成员了。 */ /*************************Main 成员变量 start*************************************/ private int i = 2;//类的成员变量,伴随着类加载而加载,存在堆区。 /*************************Main 成员变量 end*************************************/ /** 成员内部类*/ class MainChild{ private int j = 3; //属于内部类的成员变量,伴随着类加载而加载,存在堆区。 public void print(){ System.out.println(i); System.out.println(j); } } /******************************************************************************************************************************************/ /** 静态内部类或者顶级嵌套类。 * 静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。 * 静态嵌套类仅能访问外部类的静态成员和方法。 * * */ static class MainStaticChild{ int j = 3; private void print1(){ System.out.println(j); } static int i = 33; private static void print2(){ System.out.println(i); } } /******************************************************************************************************************************************/ /* * * 方法内部类或局部内部类(Local class)是定义在代码块中的类。它们只在定义它们的代码块中是可见的。 1、局部类有几个重要特性: 2、仅在定义了它们的代码块中是可见的; 3、可以使用定义它们的代码块中的任何局部 final 变量; 4、局部类不可以是 static 的,里边也不能定义 static 成员; 5、局部类不可以用 public、private、protected 修饰,只能使用缺省的; 6、局部类可以是 abstract 的。 * */ public void test1(){ /* *方法的局部变量在调用该栈帧时,存在于局部变量表中,当栈帧结束时,该变量也不存在了,因此在 *方法内部类中调用该局部变量可能因为栈帧销毁而拿不到j的值,所以设置为final */ final int j = 3; class InnerClass { public void print() { System.out.println(i); System.out.println(j); } } new InnerClass().print(); } /******************************************************************************************************************************************/ /* * 适用场景: 只用到类的一个实例 。 类在定义后马上用到。 注意: 匿名内部类不能有构造方法。 匿名内部类不能定义任何静态成员、静态方法。 匿名内部类不能是public,protected,private,static。 只能创建匿名内部类的一个实例。 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。 */ public void test2(){ final int j = 3; IA ia = new IA() { @Override public void print() { System.out.println(i); System.out.println(j); } }; ia.print(); } /******************************************************************************************************************************************/ //main函数,测试结果 public static void main(String[] args) { Main main = new Main(); //成员内部类 MainChild mainChild = main.new MainChild(); mainChild.print(); //静态内部类 Main.MainStaticChild.print2(); MainStaticChild staticChild = new Main.MainStaticChild(); staticChild.print1(); //局部内部类 main.test1(); //匿名内部类 main.test2(); } }
标签:
原文地址:http://www.cnblogs.com/DivineHost/p/5411347.html