匿名内部类
就是内部类的简化写法。
前提:存在一个类或者接口
这里的类可以是具体类也可以是抽象类,接口必须抽象
格式:
new 类名或者接口名(){
重写方法;
}
匿名对象调一个方法
interface Inter{
public abstract void show();
}
class Outer{
public void method(){
//一个方法的时候
new Inter{
public void show(){
System.out.println("show");
}
}.show();
}
}
//测试类
class InnerClassDemo6 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
匿名对象调二个方法:
interface Inter{
public abstract void show();
public abstract void show2();
}
class Outer{
public void method(){
//二个方法的时候
//匿名对象调用方法每次只能调用一次
new Inter{
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show();
//匿名对象调用方法每次只能调用一次
new Inter{
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show2();
}
}
//测试类
class InnerClassDemo6 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
//改进方案;
interface Inter{
public abstract void show();
public abstract void show2();
}
class Outer{
public void method(){
//实现该接口的子类对象------多态
Inter = new Inter{
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}
//按照多态的方式可以调用---编译看左边,运行看右边;
i.show();
i.show2();
}
//测试类
class InnerClassDemo6 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
本质是什么呢?
是一个继承了该类或者实现了该接口的子类匿名对象。
匿名内部类在开发中的应用
//匿名内部类在开发中的使用
//匿名内部类的本质是继承类或者实现了接口的子类匿名对象
/*
匿名内部类在开发中的使用
*/
interface Person {
public abstract void study();
}
class PersonDemo {
//接口名作为形式参数
//其实这里需要的不是接口,而是该接口的实现类的对象或者是接口的子类匿名对象。
public void method(Person p) {
p.study();
}
}
//实现类
class Student implements Person {
public void study() {
System.out.println("好好学习,天天向上");
}
}
class InnerClassTest2 {
public static void main(String[] args) {
//测试
PersonDemo pd = new PersonDemo();
Person p = new Student();
pd.method(p);
System.out.println("--------------------");
//匿名内部类在开发中的使用
//使用此方法无需在造一个实现类;
//匿名内部类的本质是继承类或者实现了接口的子类匿名对象
//使用匿名内部类,在整个程序运行中只能使用一次
pd.method(new Person(){
public void study() {
System.out.println("好好学习,天天向上");
}
});
}
}
匿名内部类面试题:
/*
匿名内部类面试题:
按照要求,补齐代码
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
*/
interface Inter {
//隐藏了public abstract前缀---实际应该是public abstract void show
void show();
}
class Outer {
//补齐代码
public static Inter method() {
//子类对象 -- 子类匿名对象
return new Inter() {
public void show() {
System.out.println("HelloWorld");
}
};
}
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
/*
1:Outer.method()可以看出method()应该是Outer中的一个静态方法---类名.方法名说明是静态方法。
2:Outer.method().show()可以看出method()方法的返回值是一个对象。----链式编程
又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。
*/
}
}