内部类

来源:互联网 发布:数控螺纹g92螺纹编程 编辑:程序博客网 时间:2024/06/05 05:25

内部类(inner class)

内部类是定义在另一个类中类。使用内部类主要原因有:    *内部类方法可以访问自身数据域,也可以访问创建他的外围类对象的数据域,包括私有数据。    *内部类可以对同一个包中的其他类隐藏起来。    *当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。通俗来讲,就是:当A类的程序代码要用到B类的实例对象,而B类的程序代码又要访问A类的成员,则将B类作为A类的内部类,代码就比较容易编写。例如,若TimePrinter是一个公有内部类,对于任意的外部TimeClock类都可以构造一个TimePrinter:
    TimeClock tc = new TimeClock(^^,^^);    TimeClock.TimePrinter tctp = tc.TimePrinter();
在外围类的作用域之外,这样引用内部类:    OuterClass.InnerClass***   static内部类很少使用的原因在于:用static修饰一个内部类,这个类就相当于是一个外部定义的类,这样static的内部类不能再使用外层封装类的非static的成员变量。

1、方法中定义内部类(局部内部类)

如果一个类在某方法中创建这个类型的对象只使用了一次,这种情况可以在该方法中定义局部类。如:
public void run(){    class Haha    {    }    ......}
局部类不能用public或private访问说明符进行声明。内部类不仅可以在类和方法中定义,也可以在在几个程序块的范围之内定义、或者甚至在for循环中定义局部类不仅可以访问包含它们的外部类,还可以访问局部变量,但是这些局部变量必须被声明为final。

2、用外部方法访问final变量

局部类不仅能够访问包含他们的外部类,也能够访问局部变量,但是这些局部变量不许被声明为final。【***final关键字***】final关键字可以应用于局部变量、实例变量和静态变量,在这些情况下,其含义是:在创建这个变量之后,只能够为之赋值一次,此后便不能修改它的值。final限制有时不太方便,如果用内部类访问一个变量,但该变量是需要更新变化的,这时的补救办法是使用一个长度为1的数组:
final int [] counter = new int[1];for (int i=0; i< data.length; i++){    data[i]=new data(){        public int compareTo(Data dt)        {            counter[0]++;            return super.compareTo(Data);        }    }} 

3、内部类如何被外部引用

将内部类声明为public,这样内部类就可以通过创建对象从外部类之外被调用。
class Outer {     private int outer_i=10;     public class Inner         {            public void dostuff()            {                System.out.println(++outer_i);            }         } }public class TestInner{     public static void main (String [] args)     {         Outer outer =new Outer();         Outer.Inner inner = outer.new Inner();         inner.dostuff();     }}这样外部就可创建外部类Outer的实例对象,再通过Outer的实例对象创建Inner类的实例对象,就可以使用Inner类的实例对象来调用内部类Inner中的方法。

4、匿名内部类


在局部内置类中,如果只创建该类的一个对象,就不必命名,这种类称为匿名内部类。

构造方法为:

new SuperType(parameters){inner class methods and data}

SuperType可以使接口。这里需要注意的是,构造器要求其名字与类名相同,但是匿名类没有类名,所以匿名类不能有构造器。取而代之的是,将构造器参数传递给超类构造器,尤其是在内部类实现接口的时候,不能有任何构造参数。如:

new InterfaceType(){    methods and data}

示例代码块

public abstract class WeekDay {    private WeekDay(){}    public final static WeekDay SUN = new WeekDay(){        @Override        public WeekDay nextDay() {            // TODO Auto-generated method stub            return MON;        }    };    //new WeekDay()是创建了一个子类,该子类没有名称,子类的内部代码是{}内的部分,实现子类创建实例对象。    public final static WeekDay MON = new WeekDay(){        @Override        public WeekDay nextDay() {            // TODO Auto-generated method stub            return SUN;        }    };    /*public WeekDay nextDay()    {        if(this == SUN)            return MON;        else            return SUN;    }*/    public abstract WeekDay nextDay();    public String toString()    {        return this==SUN?"SUN":"MON";       }}

0 0
原创粉丝点击