1、内部类
一个类定义在另外一个类的内部,这个该类就被称为内部类。内部类分为成员内部类(定义在外部类的成员位置)和局部内部类(定义在外部类的方法里面)。
(1) 成员内部类
class Outer
{
class Inner
{
//成员内部类
}
}
成员内部类的特点:
1、成员内部类可以直接访问外部类的成员,包括私有的,也可以通过外部类名.this.成员名调用外部成员。
2、外部类访问非静态成员内部类的成员,必须要创建成员内部类对象;外部类可以通过类名直接访问静态内部类的静态成员,包括私有的。
3、成员内部类和外部类不存在继承关系
4、其他类中生成成员内部类的方式:Outer.Inner oi = new Outer().new Inner();
(2) 局部内部类
class Outer
{
public void method()
{
final int a = 10;
class Inner
{
System.out.println(a);
//局部内部类
}
}
}
局部内部类的特点:
1、可以直接访问外部类的成员
2、在局部位置可以创建局部内部类对象,通过对象调用成员
注意:
局部内部类在访问局部变量时,被访问的变量必须用 final 修饰,这是因为局部变量随着方法调用完毕就消失了,而内部类在堆内存中并不会立即消失,所以用 final 修饰,因为被 final 修饰的变量就成了常量,即使局部变量消失了,但数值并不会消失。
2、匿名对象
没有名字的对象
class Person
{
public void show()
{
System.out.println("Person");
}
}
用法:new Person() 就能够得到一个 Person 对象,调用方法: new Person().show();
使用场景:适用于一个对象只使用一次的场景
好处:匿名对象使用完毕就变成垃圾被回收
注意:匿名对象可以作为实际参数传递
高级用法:
public abstract class Person
{
public abstract void work();
}
new Person()
{
public void work()
{
System.out.println("work");
}
}.work();
可以通过这种方式得到抽象类 Person 的子类对象
同理,接口也可以使用相同的方法得到实现类对象:
public interface Phone
{
public abstract void on();
public abstract void off();
}
Phone p = new Phone()
{
public void on()
{
System.out.println("on");
}
public void off()
{
System.out.println("off");
}
};
p.on();
p.off();
3、匿名内部类
在一个类中获取一个接口的实现类对象或者获取一个抽象类的子类对象,以 abstract Person 和 interface Phone 为例:
class Outer
{
public void method()
{
new Person()
{
public void work()
{
System.out.println("work");
}
}.work();
}
}
new Outer().method();
class Outer
{
public void method()
{
Phone p = new Phone()
{
public void on()
{
System.out.println("on");
}
public void off()
{
System.out.println("off");
}
};
p.on();
p.off();
}
}
new Outer().method();