定义:
将一个类的定义放在另一个类的定义内部,就是内部类
创建外部类:
1 public class Parcel { 2 public static void main(String[] args) { 3 Parcel pp = new Parcel(); 4 pp.ship("test str"); 5 Parcel.Contents content = pp.getContents(); 6 } 7 class Contents{ 8 private int i = 11; 9 public int value(){return i;} 10 } 11 class Destination{ 12 private String lable; 13 public Destination(String str){this.lable = str;} 14 String readLine(){return lable;} 15 } 16 public void ship(String dest){ 17 Contents cont = new Contents(); 18 Destination dests = new Destination(dest); 19 System.out.println(dests.readLine()); 20 } 21 public Contents getContents(){ 22 return new Contents(); 23 } 24 }
可以看见类Contents、Destination都是在Parcel类内部创建的,ship方法内部使用的时候和使用其他类没有什么区别。但是如果别的类想要使用的时候必须是 外部类名.new 内部类名这样使用
在方法和作用域内内部类:
内部类不仅能在类的内部创建,也可以在一个方法里面或者任意的作用域内定义。
1 public class Parcel { 2 public static void main(String[] args) { 3 Parcel p = new Parcel(); 4 Destination pp = p.getDesttination("test"); 5 System.out.println(pp.readLine()); 6 } 7 public Destination getDesttination(String s){ 8 class PDestination implements Destination{ 9 private String label; 10 private PDestination(String str){label = str;} 11 @Override 12 public String readLine() { 13 return label; 14 } 15 } 16 return new PDestination(s); 17 }
PDestination 类是getDesttination方法的一部分,它的作用域仅在方法内部,在方法之外是不能访问PDestination类的。
匿名内部类:
1 public static void main(String[] args) { 2 Parcel p = new Parcel(); 3 p.getDesttination("str", 200f); 4 } 5 public Destinations getDesttination(final String s, final float p){ 6 return new Destinations() { 7 private int cost; 8 { 9 cost = Math.round(p); 10 if (cost >100){ 11 System.out.println("over load"); 12 } 13 } 14 private String dest = s; 15 @Override 16 public String readLine() { 17 return dest; 18 } 19 }; 20 } 21 22 public interface Destinations { 23 String readLine(); 24 }
匿名内部类必须是继承一个类或者是实现一个接口,但是两个不能兼备。并且如果是实现接口,只能实现一个接口
匿名内部类中不能创建任何静态类或者静态方法。
匿名内部类不能创建构造器。
如果匿名内部类想要使用外部参数,该参数必须是final类型的。
为什么需要内部类:
一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象,所以可以认为内部类提供了某种进入其外围类的窗口。但是如果只是需要一个对接口的引用,为什么不能通过外围类实现那个接口?因为如果外围类实现接口能满足需求,就应该这么做。那内部类实现一个接口和外围类实现接口有什么区别?外围类实现接口不是总能体会到接口带来的方便,有时会需要用到接口的实现。所以使用内部类最吸引人的原因是:每个内部类都能独立地继承紫一个(接口)的实现,无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。