内部类:在一个类的定义另一个类。
为什么需要内部类?
在可以满足需求的情况下,我们尽量不要用到内部类。内部类和外围类实现接口有什么区别呢!外围类不是总能享用接口带来的方便,有时需要用到接口的实现。所以内部类最大的好处是每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。模拟多继承。
内部类的几个特性:
1、内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
3、创建内部类对象的时刻并不依赖于外围类对象的创建。
4、内部类不是is-a,它是一个独立的实体。
内部类的使用我们可以做到下面两种情况
1)实现某类型的接口,于是可以创建并返回对其的引用
2)你要解决一些复杂的问题,想创建一个类来辅助你的解决方案,但是你又不希望这个类是公共可用的。
public class Parcel4 {
private class PContents implements Contents{
private int i = 11;
@Override
public int value() {
return i;
}
}
protected class PDestination implements Destination{
private String label;
private PDestination(String whereTo){
label = whereTo;
}
@Override
public String readLabel() {
return label;
}
}
public Destination destination(String s){
return new PDestination(s);
}
public Contents pContents(){
return new PContents();
}
public static void main(String[] args) {
Parcel4 p = new Parcel4();
Contents c= p.pContents();
Destination d= p.destination("s");
}
}
匿名内部类
public class Parcel7 {
public Contents contents(){
return new Contents() {
private int i =11;
@Override
public int value() {
return i;
}
};//这个分号并不是标记此内部类的结束,是标记表达式的结束,在这里正巧包含了匿名内部类罢了,因此这里和别的地方使用的分号是一致的
}
}
//等同于下面的类
public class Parcel8 {
class MyContents implements Contents{
private int i =11;
@Override
public int value() {
return i;
}
}
public Contents contents(){
return new MyContents();
}
}
上面匿名内部类的语法是指:创建一个继承自Contents的匿名类的对象,通过new表达式返回的引用被自动向上转型为对Contents的引用。Parcel7是Parcel8的简化形式。