java中的内部类

内部类分为四种:
1.一般内部类
2.方法内部类
3.静态内部类

参见代码:

package practice;

/**
 * Created by fangjiejie on 2016/11/26.
 */
public class InnerCla {  //为什么要把a定义为final呢?
        /********方法内部类********/
       void go(final String a){//该方法会跟随类一起被释放
           class In{//此类不会随着go方法的结束而变成垃圾
                     // 类都是在变量的后面被释放掉的
               void bark(){
                   System.out.println(a);//想要在方法内部类中调用局部变量,只能将该变量声明为常量,使该常量跟随类一起被释放
               }
           }
       }
       /*******一般内部类********/
    class In{
        void go1(){
            System.out.println("In go~");
        }
    }
    /*******静态内部类*********/
    static class staC{
        void go2(){
            System.out.println(" staC go~");
        }
    }



    class D1{//多层嵌套内部类调用方法
        void d1(){
            class D2{
                void bark(){
                    System.out.println("我想被输出~");
                }
            }
            new D2().bark();//在内部类的同级位置实例化 来实现对方法的调用
        }
    }
    void go2(){
        new D1().d1();
    }
}

class tes{
    static class AA{
      static void Am(){
          System.out.println("Am go~");

      }
    }
    public static void main(String[] args) {//静态类才可以不用实例化直接调用
         InnerCla.In h=new InnerCla().new In();//两个类都要进行实例化
         h.go1();
         InnerCla.staC h1=new InnerCla.staC();//静态内部类不需要实例化
         h1.go2();
         AA.Am();//静态类中的静态方法可以直接调用无需实例化
         InnerCla h2=new InnerCla();//调用嵌套内部类方法的方案一
         h2.go2();
         new InnerCla().new D1().d1();//方案二
    }
}

4.匿名内部类
使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口
我们需要在什么情况下使用内部类呢?
1.只用到一个类的实例
2.类在定义后马上用到
3.类非常小
4.给类命名并不容易导致你的代码容易理解
使用匿名内部类要注意什么问题呢?
1.匿名内部类没有构造方法
2.匿名内部类不能定义任何静态成员。静态方法和静态类
3.匿名内部类不能是public protected private static
4.只能创建匿名内部类的一个实例
参见代码:

package practice;

/**
 * Created by fangjiejie on 2016/11/27.
 */
public class CC {

    public static void main(String[] args) {
        /********实例化匿名内部类********/
       new C(){//匿名内部类的名字由JDK控制
           public void go(){
               System.out.println("C go~");
           }
       }.go();
        C h=new C(){//如果自己命名 可用多次
            public void go(){
                System.out.println("C go~");
            }
        };
        h.go();

        /*******匿名内部类作形参*******/
        test(new C(){//匿名内部类作形参
            @Override
            public void go() {
                System.out.println(" CC---- C go~");
            }
        },"我是第二个普通形参");

        /*******返回值匿名内部类******/
        new CC().back().go();
    }

    static void test(C c,String c1){//用test方法来测试形参为匿名内部类
        c.go();//调用当前匿名内部类的go 方法
        System.out.println(c1);
    }
  //做形参的要求:1.符合多态特性 2.符合自动转换 3.等效

    C back(){//返回值为匿名内部类
        return new C(){
            @Override
            public void go() {
                System.out.println("bark go~");
            }
        };
    }
}
interface C{
    void go();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值