定义:将一个类定义在另一个类的里面,对里面的类就称为内部类。
访问特点:内部类可以直接访问外部类中的成员,包括私有成员。
而外部类要访问内部类中的成员必须要建立内部类的对象。
一般用于类的设计。
分析事物时,发现该事物中还有事物,而且这个事物还在访问被描述事物的内容。
这时就把还有的事物定义成内部类来描述。
内部类的修饰符:
直接访问外部类的内部类中的成员:
Outer.Inner in = new Outer ().new Inner();(内部类很多被封装这种情况很少见)
如果内部类是静态的。就相当于一个外部类。
Outer.Inner in = new Outer. Inner();(这时不在需要创建内部类对象)
如果内部类是静态的,成员是静态的。(此时不需要在创建对象了)
Outer.Inner.function();(注意在编译时内部类是成员如果是静态修饰的,内部类也需要用static修饰)
为什么内部类能直接访问外部类中的成员?
因为内部类持有了外部类的引用。 外部类名.this
匿名内部类,就是内部类的简写格式。
前提:内部类必须继承或者实现一个内部类或者接口。
匿名内部类:其实就是一个匿名子类对象。(做了一个简化封装动作)
格式:new 父类or接口(){子类内容}
abstract class Demo
{
abstract void show();
}
class Outer
{
int num = 4;
public void method ()
{
new Demo() //直接新建了一个demo子类对象 如果内部类有多个方法可以创建对象 //Demo demo=new Demo(); 用demo对象调用对应的内部类方法
{
void show()
{
System.out.printlnn("show................"+num);
}
}.show(); //对对象的方法进行调用
}
}
class InnerClassDemo
{
public static void main ( String [] args )
{
new Outer().method();
}
}
通常使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个,可以使用匿名内部类作为实际参数进行传递。(超过三个方法的话这个匿名内部类对象太庞大阅读性变差)
注意main方法是静态方法只能调用静态方法,不能直接访问非静态的内部类。