顾名思义,内部类是在类里面的类,它具有名字隐藏和组织代码的模式,大致的代码结构如下:
public class Outer {
public Outer() {
System.out.println("out class");
}
class Inner {
public Inner() {
System.out.println("inner class");
}
}
}
创建外部类对象,是内部类对象存在的先决条件(除了static 内部类)
1,当生成一个内部类对象的时候,此对象与制造它的外部类(对象)之间就有了一种联系,内部类指向外部对象的指针,所以它能访问外部对象的所有成员,而不需要任何特殊条件,内部类还拥有外围类的所有元素的访问权。
public class Outer {
//外部类参数
private Object[] outData = new Object[10];
public Outer() {
System.out.println("out class");
}
class Inner {
public Inner() {
System.out.println("inner class");
}
public void outputData(){
for(Object object:outData)
System.out.println(object.toString());
}
}
}
2,内部类中的this,是指向内部类的,要想调用外部对象的this,则在外部类名字后面+.this;
class Inner {
public Inner() {
System.out.println("inner class");
}
public void outputData(){
for(Object object:outData)
System.out.println(object.toString());
}
public Inner getInner(){
return this;
}
public Outer getOuter(){
return Outer.this;
}
}
3,匿名内部类:如果定义了一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要要求其参数引用是final的。
4,为啥需要内部类?
内部类继承某个类或实现某个接口,内部类的代码操作创建他的外围类对象。内部类使得多重继承的解决方案变得完整,内部类可以实现多种继承。
(1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
(2)在单个外围类中,可以让多个内部类以不同的方式事项同一个接口,或者继承同一个类。
(3)创建内部类对象的时刻并不依赖外围类的创建。
(4)内部类并没有 Is-a 的关系,它就是一个 独立的实体。
5,什么是闭包?
class Outer {
private int outi = 10;
class inner {
public int add() {
int inni = 20;
return inni + outi;
}
}
}
类似与这种,内部方法调用依赖于外面的数据,就是一种闭包,最大的作用就是函数的 封装;