java内部类

java内部类是一个据说比较重要的语法,在很多高手写的代码里可以看见。但是我辈菜鸟由于种种客观和主观原因。基本不知道怎么使用。但是为了看懂大牛的代码,还是要学习一下内部类的语法的。

1.最普通的内部类。

package com.amber.ivy;
/**
 * 测试内部类的一些特性,没有实际意义
 * @author ivyamber
 *
 */
public class OuterDemo {
private String say= "i am outerClass";
public void saySometing()
{
InnerClass ic = new InnerClass();//生成内部类对象,外部类可以直接new内部类
ic.speak();//调用内部类方法
}
public static void main(String[] args) {
OuterDemo od = new OuterDemo();
od.saySometing();
}
private class InnerClass{
public void speak()
{
System.out.println(say);//访问所属外部类的私有属性
}
}
}

以上访问内部类的方式隐藏了部分细节,

a,内部类在new的时候编译器会将外部类的引用this隐式的传入内部类,在调用外部类的方法和域的时候实际是使用this.xxx。在外部类作用域外调用内部类就要使用OuterClass.xxx。

b.以上代码会编译生成两个类OuterDemo.class和OuterDemo$InnerClass.class 后面这个是内部类的名字。

c.反编译内部类结果如下

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   OuterDemo.java


package com.amber.ivy;


import java.io.PrintStream;


// Referenced classes of package com.amber.ivy:
//            OuterDemo


private class OuterDemo$InnerClass
{


    public void speak()
    {
        System.out.println(OuterDemo.access$0(OuterDemo.this));//access$0()//内部类用来访问外部类的域的方法。
    }


    final OuterDemo this$0;//编译器为内部类自动创建的一个外部类引用,不能直接被调用


    private OuterDemo$InnerClass()
    {
        this$0 = OuterDemo.this;
        super();
    }


    OuterDemo$InnerClass(OuterDemo$InnerClass outerdemo$innerclass)
    {
        this();
    }
}

2.局部内部类。

有时候可以将内部类定义在方法里面。这样,方法外就对内部类不可见了。局部内部类不能用public或者private来修饰

package com.amber.ivy;
/**
 * 测试内部类的一些特性,没有实际意义
 * @author ivyamber
 *
 */
public class OuterDemo {
private String say= "i am outerClass";
public void saySometing()
{
class InnerClass{
public void speak()
{
System.out.println(say);//访问所属外部类的私有属性
}
}
InnerClass ic = new InnerClass();//生成内部类对象,外部类可以直接new内部类
ic.speak();//调用内部类方法
}
public static void main(String[] args) {
OuterDemo od = new OuterDemo();
od.saySometing();
}
}

ps:局部内部类除了可以方法外部类的域之外,还可以访问final的局部变量。为什么只能是final局部变量?因为final变量在初始化后不可改变,所以内部类会在构造的时候拷贝一份final变量到自己的对象里面。这样,就算外部类的方法结束,局部变量被释放也不会影响内部类使用。典型例子是外部类调用方法启动一个定时器。

3.匿名内部类

和内部类使用场景和权限没有区别,不过没有名字而已。直接new,语法比较难看。

package com.amber.ivy;


import java.util.Comparator;


/**
 * 测试内部类的一些特性,没有实际意义
 * @author ivyamber
 *
 */
public class OuterDemo {
private String say= "i am outerClass";
public void saySometing()
{
final String  other = null;
int a = 0;
Comparator ic = new Comparator<Person>() {


@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return 0;
}
};//匿名内部类,直接new 一个接口,然后实现接口方法

}
public static void main(String[] args) {
OuterDemo od = new OuterDemo();
od.saySometing();
}
}

4.静态内部类

这个是我最喜欢的了,有时候我定义内部类不是为了访问外部类的域,只是为了避免类名太普通和别人定义的类名重复了。于是我就把一个只会被我使用的类别人不需要知道的类定义为内部类。如果仅仅是出于隐藏的目的,而不调用外部类的域。可以将内部类定义为static的,这样可以避免一些不必要的引用。例如,外部类的引用



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值