java基础十四 内部类详解

来源:互联网 发布:mac截图不在桌面 编辑:程序博客网 时间:2024/05/19 04:07
内部类------>>java中将一个类定义在另一个类或一个方法中,这样的类称为内部类。
通常可以分为:成员内部类,静态内部类,局部内部类,匿名内部类
通俗点,可以通过类比java中变量来区分这几种内部类。
java中的成员变量对应:成员内部类,静态内部类
java中的局部变量对应:局部内部类,匿名内部类
成员内部类:最普通的一种内部类
class Outer {class Inner{//我是成员内部类}}
成员内部类访问特点:
1.内部类可直接访问外部类成员 包括私有(内部类之所以能获取到外部类成员 是因为它能获取到外部类的引用(外部类名.this))
2.外部类访问内部类成员 必须创建对象
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
比如:Outer.Inner in = new Outer() . new Inner()
3.内部类是可以设置权限的
静态内部类(静态成员内部类):和成员内部类一样,只是在类名之前加上了一个static关键字
class Outer {static class Inner{//我是静态成员内部类}}
静态成员内部类的访问特点:
1.外部类访问里面的非静态方法:
格式:外部类名.内部类名 对象名 = 外部类名.内部类对象
例如:Outer.Inner in = new Outer.Inner();
常规写法是:Outer.new Inner();
2.外部类访问里面的静态方法:Outer.Inner
注意:静态内部类是不需要依赖于外部类的,并且不能使用外部类的非static成员变量或者方法。静态内部类只能访问外部类的static修饰 的变量或者方法,如果想要访问外部类的非static修饰的变量和方法,就必须创建外部类的对象。

局部内部类:定义在一个方法或者作用于之中的类,它的访问仅限于方法内或者作用域内
class Outer {public void test() {class Inner {//我是局部内部类}}}
注意:
1.局部内部类(在方法中定义类) 只能在其所在方法中访问,他就像java方法中一个局部变量一样,它是不能有public protected private以及static修饰的
2.局部内部类访问局部变量(也就是局部内部类所在方法中的变量)必须用final修饰
原因:调用该这个方法时 局部变量如果没有用final修饰 它的生命周期和方法的生命周期一样 当方法弹栈 这个局部变量会消失 那么如果局部内部类对象还没马上消失 并且 想用这个局部变量 就不见了 如果用final修饰的话 会在类加载时进入常量池 即使方法弹栈 常量池的常量 还在 可以继续使用(常量池是方法区的一部分 final修饰的变量会放在常量池)
匿名内部类:内部类的简化写法 局部内部类的一种
本质:是一个类继承了该类或者实现了该接口的子类匿名对象
前提:存在一个类或者接口(这里的类可以是具体的类 也可以是抽象类)
格式:new 类名/接口名(){重写方法}
例如:有一个Inner接口 在方法中匿名内部类是 new Inner(){里面重写方法}
interface Inner {void test();}public class Outer {public static void main(String[] args) {new Inner() {@Overridepublic void test() {System.out.println("测试匿名内部类");}}.test();;}}
注意:匿名内部类只针对重写一个方法时使用 它是不能向下转型的 因为没有子类类名

匿名内部类在编译之后 Outer $1.class Outer$2.class其中1,2代表第几个匿名内部类
内部类编译之后:Outer$Inner.class