java 内部类

定义:

  将一个类的定义放在另一个类的定义内部,就是内部类

创建外部类:

 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类型的。

为什么需要内部类:

  一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象,所以可以认为内部类提供了某种进入其外围类的窗口。但是如果只是需要一个对接口的引用,为什么不能通过外围类实现那个接口?因为如果外围类实现接口能满足需求,就应该这么做。那内部类实现一个接口和外围类实现接口有什么区别?外围类实现接口不是总能体会到接口带来的方便,有时会需要用到接口的实现。所以使用内部类最吸引人的原因是:每个内部类都能独立地继承紫一个(接口)的实现,无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

路漫漫其修远兮,吾将上下而求索
原文地址:https://www.cnblogs.com/zhangchu/p/12685088.html