内部类和匿名类

来源:互联网 发布:java string 内部排序 编辑:程序博客网 时间:2024/05/22 16:59

2.内部类和匿名类

2.1内部类 

内部类主要分为:定义在方法体外的成员内部类和定义在方法体内的内部类。定义在方法体内的内部类,又可以分为有实例名称的内部类和无实例名称的内部类

使用内部类的主要原因有以下4个:

l  内部类对象能够访问其所在外部类的全部属性,包括私有属性;

l  内部类能够隐藏起来,不被同一包中的其他类所见;

l  匿名内部类可以方便地定义运行时回调;

l  使用内部内编写时间驱动程序时会非常的方便。

2.1.1如何使用内部类

   对内部类的引用,根据内部类在外部类中的位置而不同。因此使用内部类会分为以下几种方式。

(1)   对于定义在方法体外的内部类(成员内部类)

又分为以下两种情况。

l  定义在方法体外的成员内部类  如同其他类成员一样,也是附属于类的,可以通过外部类的实例来引用,即先创建一个外部类的实例,再通过该外部类的对象实例来创建内部类实例,其语法格式可以为以下两种。

new 外部类构造方法().new内部类构造方法();

外部类对象实例.内部类构造方法new();

代码1中,定义在方法体外的成员内部类,同时使用两种不同的方式,来创建内部类对象。

public class InnerClassDemo1

{

    private String s = "World";

    //自定义内部类

    class InnerClass 

    {

        //内部类构造方法

        public InnerClass()

        {

            System.out.println("This is Inner class constructor");

        }

       

        //内部类中方法,用于显示信息,包括外部类私有属性值

        public void showMessage(String str)

        {

            System.out.println("Hello "+s+","+str);

        }

    }

   

    public static void main(String[] args)

    {

        //使用第一种方法创建内部类对象,并调用内部类中方法

        InnerClass i1 = new InnerClassDemo1().new InnerClass();

        i1.showMessage("wangxyw");

        System.out.println();

       

        //使用第二种方法创建内部类对象,并调用内部类中方法

        InnerClassDemo1 demo = new InnerClassDemo1();

        InnerClass i2 = demo.new InnerClass();

        i2.showMessage("Kira");

    }

}

l  对于静态内部类的引用  静态内部类是附属于外部类的,而不附属于外部类的实例,因此不需要通过外部类的对象实例来创建内部类对象,直接通过外部类名就可以实现,语法格式如下。

new 外部类名.内部类构造方法();

代码2中,定义了一个方法体外的静态成员内部类,并在外部类的main()方法中,直接使用外部类类名直接创建内部类对象。

public class InnerClassDemo2

{

    private static String s = "World";

    //自定义内部类

    static class InnerClass 

    {

        //内部类构造方法

        public InnerClass()

        {

            System.out.println("This is Inner class constructor");

        }

       

        //内部类中方法,用于显示信息,包括外部类私有属性值

        public void showMessage(String str)

        {

            System.out.println("Hello "+s+","+str);

        }

    }

   

    public static void main(String[] args)

    {  

        //创建静态成员内部类对象,并调用内部类中方法

        InnerClass i =new InnerClassDemo2.InnerClass();

        i.showMessage("wangxyw");

    }

}

(2)   对于定义在方法体内的内部类

   由于附属于方法体,所以只能在方法体中创建对象实例,并且创建的实例也只能在方法体中被访问。所创建的对象实例的生命周期与方法相同,当方法结束后,对象也就随之消失。

public class InnerClassDemo3

{

    //定义私有字符串变量

    private String str = "World";

   

    public InnerClassDemo3() //构造方法

    {

        //调用定义的方法

        showMessage();

    }

   

    public void showMessage()

    {

        System.out.println("Now you are in method!");

        class InnerClass

        {

            //内部类构造方法

            public InnerClass()

            {

                System.out.println("This is Inner class constructor");

            }

           

            //内部类中方法,用于显示信息,包括外部类私有属性值

            public void showMessage()

            {

                System.out.println("Hello "+str+"!");

            }

        }

       

        //创建方法体内的内部类对象,并调用内部类中方法

        InnerClass i = new InnerClass();

        i.showMessage();

       

        System.out.println("Method end!");

    }

   

    public static void main(String[] args)

    {

        new InnerClassDemo3();

    }

}

2.2匿名类

在创建类的对象的时候,会有两种方式,第一种方式是创建对象后,将该对象保存在一个对象变量中,如下所示.

类名 对象名 = new 类构造方法();

另一种方式,就是所谓的匿名类方式创建对象。使用匿名类方式创建对象时,并不将创建出的对象保存在对象变量中。程序会根据创建对象的构造方法中的操作,来运行程序,当程序运行结束后,该对象生命周期也就结束了。如下所示:

new 类构造方法();

原创粉丝点击