Java 内部类种类及使用解析

来源:互联网 发布:poop软件商店下载 编辑:程序博客网 时间:2024/05/18 17:05

看代码及其中的注释,可以拷贝到eclipse中执行一下测试:


import java.util.Date;

/**
 * 演示各种内部类
 * 静态内部类static inner class (also called nested class)
 * 成员内部类member inner class
 * 局部内部类local inner class
 * 匿名内部类anonymous inner class
 * @author Administrator
 *
 */
public class OuterClass3 {
    
    private  static int a = 4;
    private  int b = 5;
    //在外部类里面创建成员内部类的实例
    public InnerClass2 in2 = this.new InnerClass2();
    
     protected static void testOut(){
         System.out.println("out static method");
     }
     protected  void testOut2(){
         System.out.println("out  method");
     }
    
     /**
      * 静态内部类
      * 只可以访问外部类的静态方法和变量,不可以访问外部的非静态类和方法
      * 无论是public,private protected都可以访问的到
      */
     public static class InnerClass{
         public void test1(){
             System.out.println(a);
             test2();
         }
         private void test2() {
            testOut();
            //static方法的访问属性无论是public,private protected都可以访问的到
            //只可以在此访问静态方法或者变量
        }
     }
     /**
      *
      *内部类可以访问外部类的所有静态和非静态的方法和类,
      *无论是public,private protected都可以访问的到
      *
      */
     public class InnerClass2{
         public int a = 1;
         public int b = 2;
        
         public void test1(){
             System.out.println(a);// 直接访问a,则访问的是内部类里的a
             System.out.println(b);
             // 如何访问到外部类里的a呢?
             System.out.println(OuterClass3.this.a);
             System.out.println(OuterClass3.this.b);
             testOut();
             testOut2();
         }
     }
     public void doInnerClass(){
         int c = 100;
         final int d = 200;
         /**
          * 方法内部类不能被以下的修饰符所修饰
          * 像局部变量一样,不能被public, protected, private和static修饰
          * 只能访问方法中定义的final类型的局部变量。
          * 可以访问外部类的变量和方法,无论是public,private protected都可以访问的到
          */
          class Inner3{
             public void test3(){
                // System.out.println(c);
                 //无法访问c,只能访问d这个final对象
                 System.out.println(d);
                 System.out.println(a);
                 System.out.println(b);
                 testOut();
                 testOut2();
             }
         }
          new Inner3().test3();
     }
     public String getDate(Date date){
         return date.toLocaleString();
     }
    public static void main(String[] args) {
        //静态内部类的调用是使用new 主类.内部类方式调用,可以调用外部类的静态变量和方法
        OuterClass3.InnerClass in = new OuterClass3.InnerClass();
        in.test1();
        System.out.println("*******************分割线***************");
        //在外部类外部调用内部类
        InnerClass2 in2 = (new OuterClass3()).new InnerClass2();
        in2.test1();
        System.out.println("*******************分割线***************");
        OuterClass3 out = new OuterClass3();
        out.doInnerClass();
        System.out.println("*******************分割线***************");
        System.out.println(out.getDate(new Date()));
        
        System.out.println(out.getDate(new Date(){

            @Override
            public String toLocaleString() {
                // TODO Auto-generated method stub
                return "Hello "+super.toLocaleString();
            }
            
        }));
    }
}
根据http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html的文章内容做得实验


原创粉丝点击