可以将一个类定义在另一类的内部,这就是内部类。一起来看一个实例,看一下什么是内部类,以及如果调用内部类呢?
public class Parcel { class Contents{ private int i = 11; public int value(){return i;} } class Destination{ private String label; Destination(String whereTo){ label = whereTo; } String readLabel(){return label;}; } public Destination to(String s){ return new Destination(s); } public Contents contents(){ return new Contents(); } public void ship(String dest){ Contents c = contents(); Destination d = to(dest); System.out.println(d.readLabel()); } public static void main(String[] args){ Parcel p = new Parcel(); p.ship("TEST"); Parcel q = new Parcel(); Parcel.Contents c= q.contents(); System.out.println(c.value()); Parcel.Destination d = q.to("test"); System.out.println(d.readLabel());
System.out.println(p.new Destination("3333").readLabel());}}
从这个例子我们可以看到Contents和Detination定义在Parcel内部,作为Parcel的内部类使用。
从外部类的非静态方法创建内部类对象的方法:OutClassName.InnerClassName.内部类可以直接使用外部类的成员变量
外部类可以使用new 内部类来创建内部类的对象, 如: 外部类对象.new InnerClassName();
在方法和作用域内的内部类:可以在一个方法或者在任意作用域内定义内部类。如下实例:
/** * Created by yuanqisheng on 2017/4/1. * 作用于方法内部的内部类 */ public class Parcel5 { public Destination destination(String s) { class PDestination implements Destination{ private String label; PDestination(String whereTo) { label = whereTo; } String readLabel() {return label;} } return new PDestination(s); } public static void main(String[] args){ Parcel5 p = new Parcel5(); Destination d = p.destination("yuanqs"); } }
匿名内部类:从字面上理解就是没有名字的内部类,话不多说,直接上例子来的直接:
/** * Created by yuanqisheng on 2017/4/1. * 匿名内部类 */ public class Parcel6 { public Contents contents(){ return new Contents(){ private int i=11; public int value(){return i;} }; } public static void main(String[] args){ Parcel6 p = new Parcel6(); Contents c = p.contents(); } }语法解释:创建一个继承Contents的匿名类的对象,通过new 表达式返回的引用自动向上转型对Contents的引用。
可能大家都很疑惑,为什么要使用内部类呢,使用接口也都可以实现呀!看了之前的实例,大家也应该有点了解了吧。下面讲讲使用内部类的原因和特性。
使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
如果使用的是抽象类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承。
使用内部类的特性:
1,内部类可以有多个实例,每个实例都有自己的状态信息,并且在外围类对象的信息相对独立
2,在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
3,创建内部类对象的时刻并不依赖于外围类对象的创建。
4,内部类并没有令人迷惑的“ is - a”关系;它就是一个独立的实体。
敬请关注下一节内容:java编程思想之持有化对象