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();
}
}