/*
* 1、内部类:
* 定义在另外一个类里面的类,就叫做内部类,为了区别,把外面的类称为外部类。
*
* 2、分类
* 根据内部类的所在的位置不同:
* (1)成员内部类:外部类中方法外
* (2)局部内部类:方法体内,(虽然也可以在代码块内,但是不讨论这个)
*
*
* 成员内部类:
* (1)有static修饰的:静态成员内部类,我们通常就简称为静态内部类
* (2)没有static修饰的:非静态成员内部类,我们通常就简称为成员内部类
* 【修饰符】 class 外部类{
* 【其他修饰符】 static class 静态内部类{
* }
* 【其他修饰符】 class 非静态成员内部类{
* }
* }
*
* 【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
* 【其他修饰符】 static class 静态内部类 【extends 父类】 【implements 父接口们】{
* }
* 【其他修饰符】 class 非静态成员内部类 【extends 父类】 【implements 父接口们】{
* }
* }
* 说明:外部类、内部类的父类、父接口没有关系,各是各的
*
*
* 局部内部类:
* (1)有名字的局部内部类:简称局部内部类
* (2)没名字的局部内部类:简称匿名内部类
*
* 局部内部类的语法格式:
* 【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
* 【修饰符】 返回值类型 方法名(【形参列表】){
* 【修饰符】 class 有名字的局部内部类 【extends 父类】 【implements 父接口们】{
* ...
* }
* }
* }
*
* 匿名内部类的语法格式:
* 特殊
*/
7.10.1 匿名内部类
1、语法格式:
//在匿名子类中调用父类的无参构造
new 父类(){
内部类的成员列表
}
//在匿名子类中调用父类的有参构造
new 父类(实参列表){
内部类的成员列表
}
//接口没有构造器,那么这里表示匿名子类调用自己的无参构造,调用默认父类Object的无参构造
new 父接口名(){
}
2、匿名内部类、匿名对象的区别?
System.out.println(new Student("张三"));//匿名对象
Student stu = new Student("张三");//这个对象有名字,stu
//既有匿名内部类,又是一个匿名的对象
new Object(){
public void test(){
.....
}
}.test();
//这个匿名内部类的对象,使用obj这个名字引用它,既对象有名字,但是这个Object的子类没有名字
Object obj = new Object(){
public void test(){
.....
}
};
(1)示例代码:继承式
abstract class Father{
public abstract void test();
}
class Test{
public static void main(String[] args){
//用父类与匿名内部类的对象构成多态引用
Father f = new Father(){
public void test(){
System.out.println("用匿名内部类继承了Father这个抽象类,重写了test抽象方法")
}
};
f.test();
}
}
(2)示例代码:实现式
interface Flyable{
void fly();
}
class Test{
public static void main(String[] args){
//用父接口与匿名内部类的对象构成了多态引用
Flyable f = new Flyable(){
public void fly(){
System.out.println("用匿名内部类实现了Flyable这个接口,重写了抽象方法");
}
};
f.fly();
}
}
(3)示例代码:用匿名内部类的匿名对象直接调用方法
new Object(){
public void test(){
System.out.println("用匿名内部类的匿名对象直接调用方法")
}
}.test();
(4)示例代码:用匿名内部类的匿名对象直接作为实参
Student[] all = new Student[3];
all[0] = new Student("张三",23);
all[1] = new Student("李四",22);
all[2] = new Student("王五",20);
//用匿名内部类的匿名对象直接作为实参
//这个匿名内部类实现了Comparator接口
//这个匿名内部类的对象,是定制比较器的对象
Arrays.sort(all, new Comparator(){
public int compare(Obeject o1, Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
return s1.getAge() - s2.getAge();
}
});