匿名内部类:
实际上就是内部类的简写方式。
前提:
存在一个类或者接口。
这里的类可以是具体类也可以是抽象类。
格式:
new 类名或者接口名(){//注意本质代表的是:继承了该类或者实现了该接口的子类匿名对象。
重写方法;
}
new的目的是在内存中分配内存,创建对象。
本质:
是一个继承了该类或者实现了该接口的子类匿名对象。
案例:
定义一个接口:
show
show2
由于调用两个show方法时候显得程序臃肿,而且若是有大量方法调用时这种方法不可取,顾可简化。
思考,前面我们说了,匿名内部类的实质就是继承该类或者实现了该接口的的子类匿名对象。所以我们可以把这个匿名内部类赋值给父类(接口)---也就是我们说的多态实现。
我们要好好学习!
study hard!
面试题:
按照要求补齐代码:
Outer直接调用method说明在Outer中有一个静态的method()方法,接着调用show方法说明method方法返回的是一个Inter类型的接口对象(因为调用了show方法)。
所以:
实际上就是内部类的简写方式。
前提:
存在一个类或者接口。
这里的类可以是具体类也可以是抽象类。
格式:
new 类名或者接口名(){//注意本质代表的是:继承了该类或者实现了该接口的子类匿名对象。
重写方法;
}
new的目的是在内存中分配内存,创建对象。
本质:
是一个继承了该类或者实现了该接口的子类匿名对象。
案例:
定义一个接口:
package com.haust.day10.demo8;
public interface Inter {
public abstract void show();
public abstract void show2();
}
Outer类:
package com.haust.day10.demo8;
public 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();//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
}
}
入口类:
package com.haust.day10.demo8;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
输出:
show
show2
由于调用两个show方法时候显得程序臃肿,而且若是有大量方法调用时这种方法不可取,顾可简化。
思考,前面我们说了,匿名内部类的实质就是继承该类或者实现了该接口的的子类匿名对象。所以我们可以把这个匿名内部类赋值给父类(接口)---也就是我们说的多态实现。
package com.haust.day10.demo8;
public class Outer {
public void method(){
//创建一个匿名内部类
//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
Inter i = new Inter(){//实现多态
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
};//实质:是一个继承了该类或者实现了该接口的子类匿名对象。
i.show2();
i.show2();
}
}
匿名内部类在开发中的应用:
案例:
Person接口
package com.haust.day10.demo9;
public interface Person {
public abstract void study();
}
Student实现类:
package com.haust.day10.demo9;
public class Student implements Person{
public void study() {
System.out.println("我们要好好学习!");
}
}
PersonDemo类:
package com.haust.day10.demo9;
public class PersonDemo {
public void method(Person p){
p.study();
}
}
入口类:
package com.haust.day10.demo9;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
//创建对象
PersonDemo pd = new PersonDemo();
Person p = new Student();//实现多态
pd.method(p);
/*
* 思考:这是我们之前熟悉的写法,结合今天的匿名内部类学习知识
* 我知道了匿名内部类的实质就是继承该类或者实现了该类的接口的匿名对象
* 所以我们可以用匿名内部类方法来改写以上代码
* */
pd.method(new Person(){
public void study() {
System.out.println("study hard!");
}
});
}
/*
这种代码方式不如第一种方式好理解,但是简练,
而且在安卓里经常使用,因为匿名内部类用完就是“垃圾”,
没有栈内存指向其,所以在手机端开发经常使用。
*/
}
输出:
我们要好好学习!
study hard!
面试题:
按照要求补齐代码:
interface Inter{void show();};
class Outer{//代码}
class OuterDemo{
public static void main(String args[]){
Outer.method.show();
}
}
//在控制台输出hello world!
分析:
Outer直接调用method说明在Outer中有一个静态的method()方法,接着调用show方法说明method方法返回的是一个Inter类型的接口对象(因为调用了show方法)。
所以:
package com.haust.day10.demo10;
public interface Inter {
public abstract void show();
}
Outer类:
package com.haust.day10.demo10;
public class Outer {
public static Inter method(){
return new Inter(){
public void show(){
System.out.println("hello world!");
}
};
}
}
入口类:
package com.haust.day10.demo10;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Outer.method().show();
}
}