含义:把一个类定义放到另一个类的内部
例如:
public class demo
{
class I
{
demo get()
{
demoO.this;
}
}
public static void main(String[] args) {
demo outer = new demo();
demo.I inner = outer.new I();
System.out.println(outer == inner.get());
}
}
诠释:
1.内部类的创建依赖外部类对象
2.外部类的作用域之外,可以使用 outerClass.innerClass 方式引用内部类
3.内部类访问外部类不需要任何特殊条件,拥有外部类所有的访问权
4.内部类不仅能够访问包含他的外部类,还可以访问局部变量(但是局部变量必须被声明为final?因为局部内部类会将调用的变量进行拷贝,为了保证一致性,所以变量必须为final)
注意:
1.内部类可以声明为private 与protected,可以对同一个包中其他类隐藏
2.内部类持有的外部类对象就是外部类对象本身,内存地址是相同的
3.内部类可以达到类似"多重继承"的效果(每个内部类都能独立的继承自一个(接口的)实现)
接下来说说分类:
内部类分为 1.成员内部类 2.局部内部类 3.匿名内部类 4.静态内部类
---------------------------------------------------------------------------------------------------------
成员内部类(实例内部类)
例如:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();//注意是对象.new
注意:
每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在
既然是成员内部类,和成员属性成员方法地位上自然没有什么不同
每个外部类对象都有一个内部类对象,自然持有外部类的引用
-------------------------------------------------------------------------------------------------
局部内部类
局部内部类不能用public或者private或者protected访问说明符,作用域被限定在了声明这个局部内部类中
局部类可以对外面完全的隐藏起来,即使是外部类的其他的代码也不能访问他
局部内部类虽然被限定在局部代码块{} 里面,但是他也是可以访问外部类的属性的
-----------------------------------------------------------------------------------------
匿名内部类
匿名内部类就是局部内部类的进一步隐藏,局部内部类定义了之后在局部区域内仍旧可以创建多个对象
匿名内部类声明一个类之后就只能创建一个对象了,因为他并没有类名字
形式为:
new xxxClass (){ //或者new xxxInterface()
//.......
}
表示创建一个类的对象,这个类是xxxClass 子类或者实现了xxxInterface 接口的类
也可以说匿名内部类就是创建了一个匿名类的子类对象
构造方法名字和类名是相同的,匿名内部类显然是没有构造方法的,因为连名字都没有
既然没有构造方法想要构造参数,就只能把参数传递给外部的构造器,通过外部类的构造器绕一圈,本身内部类可以访问外部类所有的属性,去把值操作起来
当然外部类自然可以搞点属性根据业务逻辑单独给内部类用
如果是实现接口,不能带任何的参数的,因为接口都没有构造方法的呀
例:匿名内部类的参数传递
fun(new ArrayList<String>(){{add("a");add("b");add("c");}});
fun(new ArrayList<String>()
{
{
add("a");
add("b");
add("c");
}
}
---------------------------------------------------------------------------------------------------------
静态内部类
将内部类声明为static, 只是为了将一个类隐藏到一个类的内部,并不需要内部类引用外部类的对象
静态的创建形式:
Outer.Inner inner = new Outer.Inner();
通过 外部类 . 内部类 来访问