android笔记一:java内部类


做了多年的Java和Flex的研发,现在总感觉app这块很重要,所以自己就开始了android的学习,由于android的研发会经常和内部类打交道,所以先回顾下这方面的知识。

什么是内部类

内部类其实就是在一个类的作用域中定义一个类类型。根据内部类定义所在的位置和使用的修饰符,可以将内部类分为:成员内部类,静态内部类(嵌套内部类),局部内部类和匿名内部类。成员内部类定义在一个类中,并不用static修饰;静态内部类也是定义在一个类中,但使用static修饰;局部内部类定义在方法中;而匿名内部类就是没有名字的内部类。

内部类的创建及其作用域

作用域:内部类的作用域和其他属性或者变量的作用域是一样的,他们都被限定在了大括号{}内,只是成员内部类和属性一样具有访问修饰符,所以可以被其他的类所访问。

内部类创建:内部类在任何一个地方都可以定义,包括方法的参数列表,只是定义的地方不同,作用域不一样。例如:静态构造块、构造块、构造方法、成员方法、条件语句等。

常用的内部类的定义方式:

public class OuterClass {

       /*

       * 成员内部类。可以使用访问修饰符限定。

       * 可以指定访问修饰符,不指定和成员属性一样

       * */

      class InnerClass{

           private String msg ;

      }

      /*

      * 创建匿名内部类,并赋值给成员属性.

      * 注意:匿名内部类不能拥有构造方法

      * */

      private Thread th = new Thread(){

      };

      /*

      *静态内部类(嵌套类)

      *可以指定访问修饰符,不指定和成员属性一样

      * */

      static class SInnerClass{

      }

      /*

      * 在方法中创建内部类。

      * 注意:如果在内部类中要使用参数msg或者变量num,则需要

      * 将这两个声明为final类型。

      * */

      private void create(String msg){

           int num = 0 ;

           //定义一个内部类

           class MInner{

                public void show(){}

           }


           MInner s = new MInner() ;

           //创建匿名内部类

           new Thread(){

               @Override

               public void run() {

               }

           }.start();

      }

}

内部类的访问方式:

内部类生成的对象同时拥有指向封装对象(外部类)的一个链接,所以内部类可以直接访问外部类的成员,内部类拥有访问外部类所有元素的访问权限,当然除开静态内部类

外部类访问内部类

private void visit(){

     //访问非静态内部类:方法一,可适用于其他类访问

     OuterClass.InnerClass inner1= new OuterClass().new InnerClass() ;

     InnerClass inner11 = new OuterClass().new InnerClass() ;

     //访问非静态内部类:方法二

     InnerClass inner2 = new InnerClass() ;


     //访问静态内部类:方法一,可适用于其他类访问

     OuterClass.SInnerClass sinner1 = new OuterClass.SInnerClass() ;

     //访问静态内部类:方法二

     SInnerClass sinner2 = new SInnerClass() ;

}

private static void svisit(){

     //访问非静态内部类:方法一,可适用于其他类访问

     OuterClass.InnerClass inner1 = new OuterClass().new InnerClass() ;

     InnerClass inner11 = new OuterClass().new InnerClass() ;

     //访问非静态内部类:方法二,这样不对,报错。

     //InnerClass inner2 = new InnerClass() ;


     //访问静态内部类:方法一,可适用于其他类访问

     OuterClass.SInnerClass sinner1 = new OuterClass.SInnerClass() ;

     //访问静态内部类:方法二

     SInnerClass sinner2 = new SInnerClass() ;

}

内部类访问外部类:

/*

   * 成员内部类。

   * */

  class InnerClass{

        private void show(){

            //直接调用外部的方法

            outerShow(); //调用外部类非静态方法

            outerSShow();//调用外部类静态方法

            OuterClass.outerSShow();//调用外部类静态方法

            //通过外部类的this来调用外部类方法

            OuterClass.this.outerShow() ;

        }

  }

  /*

  *静态内部类

  * */

  static class SInnerClass{

       private void show(){

          //直接调用外部的方法

          new OuterClass().outerShow() ; //调用外部类非静态方法

          outerSShow(); //调用外部类静态方法

          OuterClass.outerSShow(); //调用外部类静态方法

       }

   }

总结:

   静态内部类:类定义时加上static关键字。被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。只可以直接访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。


成员内部类:类似成员属性,定义时不用static修饰。可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。


局部内部类:在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。并只能访问方法中定义的final类型的局部变量。


匿名内部类:没有名字的局部内部类,隐式地继承了一个父类或者实现了一个接口,匿名内部类使用得比较多,通常作为一个方法参数,获取独自开启一个线程来完成一个数据的初始化等。


本文出自 “因简单而自在” 博客,谢绝转载!

你可能感兴趣的:(java,android,内部类)