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 类构造方法();