A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦想家宇仔 中级黑马   /  2016-1-4 23:28  /  728 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

.局部内部类:
局部内部类是在一个方法当中定义的内部类,它的可见范围是当前方法和局部变量一样,局部内部类不能使用访问修饰符(public , private , protected) 以及 static 来修饰,        局部内部类的特点是:(1) 局部内部类只能在当前方法中使用.    class A{    //B b = new B();//error    public void method(){        class B        {            int v1;            int v2;            class C            {                int v3;            };        };        B b = new B();        B.C c = b.new C();        //可见B和C的作用作用域均在method方法体内    }}(2) 局部内部类和实例内部类一样,不能包含静态成员。    原因:(反证)如果可以包含->该内部类必须为static->而局部内部类不能被成员修饰符修饰class A{    public void method(){        class B        {            //static int v1;//error            int v2;            //static class C //error            {                int v3;            }        }    }}

(3) 在局部内部类中定义的内部类同样也不能被public  protected, private这些访问修饰符修饰(局部内部类不能被public  protected  private访问修饰符修饰)(4)  局部内部类和实例内部类一样,可以访问外部类的所有成员(依然持有外部类引用:Outer.this),此外,      局部内部类还可以访问所在方法中的final类型的参数和变量(关于这一点我想另写一篇讨论)class A{    int a;    public void method(final int p1,int p2){        int localV1 = 1;        final int localV2 = 2;        class B        {            int b1 = A.this.a;            int b2 = p1;            //int b3 = p2;//error 不能访问,p2非finnal            //int b4 = localV1//error 同理            int b5 = localV2;        };    }}
5.匿名内部类(匿名子类对象):
(1) 匿名内部类本身没有构造器(无类名),但是会调用父类中的构造器。(相当于该匿名内部类实现了接口或继承一个类)public class A {    A(int y){        System.out.println("不是默认构造器");    }    A(){        System.out.println("默认构造器");    }        void method(){        System.out.println("from A");    }        public static void main(String[] args) {        //new A().method();//默认构造器,from A        A a = new A(){            void method(){                System.out.println("我是匿名内部类中的method方法");            }        }        //也就是说匿名构造器会自动调用父类中的构造器        a.method();//输出结果:默认构造器 我是匿名内部类中的method方法    }}  (2) 匿名内部类尽管没有构造方法(因为没有类名),但是可以在匿名内部类中提供一段实例初始化代码(构造代码块),Java虚拟机会在调用了父类的构造方法之后,执行这段代码。  public static void main(String [] args){ int v = 1; A a = new A(v){        {      System.out.println("init instance");     }     void method(){     System.out.println("from anonymous");    }   }a.method();}  程序执行结果如下:  another constructer//父类当中的构造器执行的结果  init instance  from anonymous (3) 除了可以在外部类的方法内定义匿名类外,还可以在声明一个成员变量时定义匿名内部类。   abstract class A{                A a = new A(){           void method(){             System.out.println("inner");            }           //把匿名内部类定义在了成员位置上     }     abstract void method();    }

(4)   匿名内部类除了可以继承类外,还可以实现接口【重点】    Class Sample{   public static void main(String [] args){      Thread t = new Thread(new Runnable(){        public void run(){             for(int i = 0; i < 100; i++){               System.out.print(i);            }    }      });   }   }(5) 匿名内部类同局部内部类一样,可以访问外部类的所有成员,如果匿名内部类位于一个方法中,还能访问所在方法的final 类型的变量和参数(6) 局部内部类和匿名内部类一样,名字在方法外都是不可见的,因此都可以起到封装类型名字的作用。

3 个回复

倒序浏览
。。。你要是能排版下会比较好,这样有点眼晕

点评

+1  发表于 2016-1-5 10:33
回复 使用道具 举报
排版有点乱 {:2_41:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马