内部类

概述

     当一个事物在另外一个事物内部的时候,我们把内部的事物用内部类来描述

class Body{
       class Blood{//血液就在人体的内部,用内部类更贴切

       }
       class Bone{

       }
       class Heart{

       }
     }

分类

    1.成员内部类:定义在成员位置上的类

class Outer{
          private int i=3;
          private static int j=10;
        class Inner{
          private int i=2;
          public void innerMethod(){
              int i=1;
              System.out.println(i);//1
              System.out.println(this.i);//2 内部类的this访问的Inner的成员变量
              System.out.println(Outer.this.i);//3 通过外部类的this访问外部类的成员
              System.out.println(Outer.j);//10
          }
        }
      }
 class Body{
          class Heart{
             public void jump(){
              System.out.println("我心永恒");
             }
          }
        public Heart getHeart(){//Body类的方法
            return new Heart();

        }
      }
import 包名.Body.Heart;//使用到Heart类型需要导入,import 包名.外部类名.内部类名
      class Demo{
          public static void main(String[] args) {
              Body body=new Body();
              Heart heart=body.getHeart();
              heart.jump();//我心永恒
          }
      }

    2.局部内部类:定义在局部位置上的类

 interface Father{
           public abstract void innerMethod();
      }
 class Outer{
           public Father outerMethod(){//不能使用Inner作为返回值,因为在outerMethod方法定义的时候
                                        //还没有加载Inner类,Inner类只有outerMethod被调用的时候才加载Inner类
                                        //返回值为Father,相当于Father father=new Inner();//父接口指向子类对象
                  final int i=3;//局部内部类可以访问局部变量,但是这个变量必须加final修饰
               class Inner implements Father{
                       public void innerMethod(){
                    System.out.println("我是内部类的方法,我怕谁!!"+i);
                       }
                  }
              return new Inner();
           }
         
      }
  class Demo{
          public static void main(String[] args) {
               Outer outer=new Outer();
               Father father=outer.outerMethod();//Father father=new Inner();
               father.innerMethod();//编译看左边,运行执行Inner中的innerMethod方法
          }
      }

 

posted @ 2018-05-31 10:15  木东木容  阅读(116)  评论(0编辑  收藏  举报