java内部类的浅谈(错误之处还请见谅!)
在java中,内部类是指在一个外部类的内部再定义一个类(即类中的类)。类名不需要和文件夹相同。
内部类分为: a:成员内部类,b:局部内部类,c:静态内部类,d:匿名内部类 。
a:成员内部类:成员内部类是最普通的内部类,它的定义为位于另一个类的内部。就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
class Outter { private int age = 20; class Inner { private int age = 21; public void print() { int age = 22; System.out.println("局部变量:" + age); System.out.println("内部类变量:" + this.age); System.out.println("外部类变量:" + Outter.this.age); } } } public class test1 { public static void main(String[] args) { Outter out = new Outter(); Outter.Inner in = out.new Inner(); in.print(); } }
输出的结果:
局部变量:22
内部类变量:21
外部类变量:20
可以看出:成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。我是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的
b:局部内部类
局部内部类是定义在一个方法里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内。
class Outter { private int age = 12; public void Print(final int x) { class Inner { public void inPrint() { System.out.println(x); System.out.println(age); } } new Inner().inPrint(); } } public class test1 { public static void main(String[] args) { Outter out = new Outter(); out.Print(10); } }
输出的结果:
10
12
以上的代码中我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义。换句话说,在方法中定义的内部类只能访问方法中final类型的局部变量,这是因为在方法中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于局部变量被设置为final,所以不能再内部类中改变局部变量的值。
c:静态内部类
静态内部类就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,即不需要创建外部类,也不需要创建内部类。
d:匿名内部类 。
匿名内部类其实是局部内部类的一种,就是内部类的简化写法。前提条件是 存在一个类或者接口(匿名内部类必须和某个类或者接口发生关系);本质是一个继承了该类或者实现了该接口的子类匿名对象。
匿名内部类是不能有访问修饰符和static修饰符的。
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限。