内部类
内部类,即类内部的类。类中类。形式如下:
public class Outter{
// 外部类
class Inner{
// 内部类
}
}
内部类的作用
内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
内部类拥有外围类的所有元素的访问权限
可以实现多重继承
匿名内部类优化接口
隐藏细节
平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许
有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。这看起来没
什么作用,但是当内部类实现某个接口的时候,在进行向上转型,对外部来说,就完全隐藏了接口的实
现了。
可以无条件地访问外围类的所有元素
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通
过this访问外部类的成员。
可以实现多重继承
这个特点非常重要,它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加
完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。
但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了
内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。
通过匿名内部类来优化简单的接口实现
有了匿名内部类,可以不需要定义一个新的类,而直接通过匿名内部类创建对象。对那些只是用一
次的类是非常方便的事情。
内部类的分类
成员内部类、局部内部类、匿名内部类和静态内部类。
内部类的共性
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部 类的类名和$符号 。
内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的 成员变量,无论是否是private的 。
内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态 成员变量
1.成员内部类
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
内部类中的变量访问形式
内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量;若有同名
情况时,直接访问会导致内部类中的局部变量将外部类的成员变量覆盖,访问内部类本身的成员变量可
用this.属性名,访问外部类的成员变量需要使用Out.this.属性名
创建内部类实例
Out.Inner inner