局部内部类:定义在方法中,可以看作是一个方法中的局部变量,只能在该方法中使用。
测试代码如下:
/**
* 定义一个局部内部类,可以将其看作一个方法中的局部变量,只能在该方法中使用
* @author Rao
*
*/
class LocalInner
{
public void doSomething()
{
int a = 4;
final int b = 5;
class Inner3
{
public void test()
{
//不能访问外部方法中的非终态变量
// System.out.println(a);
//局部内部类中的方法只能访问其外部方法中声明的final类型的变量
System.out.println(b);
}
}
//只能在定义该局部内部类的外部方法里面生成其对象并调用其内部方法
new Inner3().test();
// 上面的一句等价于以下两句
// Inner3 inner3 = new Inner3();
// inner3.test();
}
}
public class LocalInnerClassTest
{
public static void main(String[] args)
{
//实际上是执行了new Inner3().test();
LocalInner localInner = new LocalInner();
localInner.doSomething();
//等价于上面的两句
new LocalInner().doSomething();
}
}
匿名内部类:与局部内部类一样,匿名内部类也是定义在方法中的,但匿名内部类不是以‘局部变量’的形式出现,而是以某个方法的参数的形式出现,它没有特定的名字,运行时系统会自动为其取个别名。
测试代码如下:
//匿名内部类
public class AnonymousInnerClassTest
{
@SuppressWarnings("deprecation")//压制警告
public String get(Date date)
{
return date.toLocaleString();
}
public static void main(String[] args)
{
AnonymousInnerClassTest test = new AnonymousInnerClassTest();
String str = test.get(new Date());
System.out.println(str);
/**
* 同注释部分不同的是下面生成了一个匿名内部类,同局部内部类一样用在方法里面,
* 它会隐式地继承一个父类或实现一个接口,若Date是类就是继承,若是接口就是实现。
* 在这里这个匿名内部类继承了Date,故其继承了toLocaleString方法。
*/
String str2 = test.get(new Date()
{
//在匿名内部类里重写toLocaleString方法
@Override
public String toLocaleString()
{
return "hello world";
}
});
System.out.println(str2);
}
}
参考文献:圣思园视频