内部类存在的意义
1、可以实现多重继承
个特点非常重要,个人认为它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类
2、 避免修改接口而实现同一个类中两种同名方法的调用。
大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了
3、
内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
特点
内部类拥有外围类的所有元素的访问权限。
内部类可以分为:实例内部类、静态内部类和成员内部类
内部类的特点如下:
- 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的 .class 文件,但是前面冠以外部类的类名和 $ 符号。
- 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否为 private 的。
- 内部类声明成静态的,就不能随便访问外部类的成员变量,仍然是只能访问外部类的静态成员变量
实例内部类是指没有用 static 修饰的内部类
1、在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。
2、在实例内部类中,可以访问外部类的所有成员。
3、在外部类中不能直接访问内部类的成员
4、在实例内部类中不能定义 static 成员,除非同时使用 final 和 static 修饰。
静态内部类是指使用 static 修饰的内部类
1、在创建静态内部类的实例时,不需要创建外部类的实例。
2、静态内部类中可以定义静态成员和实例成员
3、外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。
4、静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例去访问。
局部内部类是指在一个方法中定义的内部类
1、局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。
2、局部内部类只在当前方法中有效。
3、局部内部类中不能定义 static 成员。
4、 局部内部类中还可以包含内部类,但是这些内部类也不能使用访问控制修饰符(public、 private 和 protected)和 static 修饰符修饰。
5、在局部内部类中可以访问外部类的所有成员。
6、在局部内部类中只可以访问当前方法中 final 类型的参数与变量。如果方法中的成员与外部类中的成员同名,则可以使用 <OuterClassName>.this.<MemberName> 的形式访问外部类中的成员。
public class Test { int a=0; int d=0; public void method() { int b=0; final int c=0; final int d=10; class Inner { a2=a; //访问外部类中的成员 //intb2=b; //编译出错 int c2=c; //访问方法中的成员 int d2=d; //访问方法中的成员 int d3=Test.this.d; //访问外部类中的成员 } Inner i=new Inner(); System.out.println(i.d2); //输出10 System.out.printIn(i.d3); //输出0 } public static void main(String[] args) { Test t=new Test(); t.method(); } }