匿名内部类
l就是内部类的简化写法。
l前提:
•内部类可以继承或实现一个外部类或者接口。
l格式为:
•new外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}
l简单理解:
•就是建立一个带内容的外部类或者接口的子类匿名对象。
package com.test3;
/*
匿名内部类的形式。
其实就是对内部类进行简化书写。
必须有前提:
内部类必须继承或者实现类或接口。
格式:
new 父类名或者接口名(){定义内部类的内容;}
匿名内部类其实就是一个子类匿名对象。
*/
abstract class AbsDemo
{
abstract void function();
}
class Outer
{
int num = 4;
/*
class Inner extends AbsDemo
{
void function()
{
System.out.println("num="+num);
}
}
*/
void method()
{
// new Inner().function();
new AbsDemo()//创建了内部类的对象。
{//对内部类的描述。
void function()
{
System.out.println("num===="+num);
}
}.function();
}
}
class NoNameInnerDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
}
}
package com.test4;
abstract class AbsDemo
{
abstract void function();
abstract void show();
}
class Outer
{
int num = 4;
/*
class Inner extends AbsDemo
{
void function(){}
void show(){}
}
*/
void method()
{
// Inner in = new Inner();
// in.function();
// in.show();
AbsDemo a = new AbsDemo()
{
void function(){}
void show(){}
};
a.function();
a.show();
}
void method2()
{
Object obj = new Object()//父类引用指向了子类对象。子类对象被向上转型了。
{
void show2(){System.out.println("show2 run");}
void show3(){System.out.println("show3 run");}
};
// obj.show2();//失败的。因为Object中没有定义show2方法。
}
}
class NoNameInnerDemo2
{
public static void main(String[] args)
{
// Outer out = new Outer();
// out.method2();
Outer2.show().method();
/*
Outer2.show(): Outer2类中有一个show方法。而且这个方法是被静态修饰的。
Outer2.show().method();调用完show方法后的运算结果是一个对象,一个可以调用method方法的对象。
这个对象类型一定是Inter类型。
*/
}
}
class Outer2
{
//补足内部代码。用匿名内部来完成。
static Inter show()
{
return new Inter()
{
public void method(){}
};
}
}
interface Inter
{
public void method();
}