7.2 匿名类
7.2.1 和子类有关的匿名类
//匿名类创建对象,Bank是类
new Bank(){
匿名类类体
};
匿名类特点:
(1)可以继承父类方法,也可以重写父类方法
(2)使用匿名类的时候,必然是在某个类中直接使用匿名类创建对象,因此匿名类一定是内部类
(3)匿名类可以访问外嵌类中的成员变量和方法,匿名类类体不可以声明static成员变量和方法
(4)由于匿名类是一个子类,但是没有类名,所以在用匿名类创建对象时,直接使用父类的构造方法
(5)虽然匿名类创建的对象没有经过声明步骤,但是匿名对象的引用可以传递一个匹配的参数
//匿名类例子:
public abstract class Example7_2_OutputAlphabet {
public abstract void output();
}
public class Example7_2_OutputEnglish extends Example7_2_OutputAlphabet {
@Override
public void output() {//调用父类的构造方法
// TODO Auto-generated method stub
for (char c = 'a'; c < 'z'; c++) {
System.out.printf("%3c", c);//带3位空格输出
}
}
}
public class Example7_2_ShowBoard {
void showMessage(Example7_2_OutputAlphabet show) {
show.output();
}
}
public class Example7_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Example7_2_ShowBoard showBoard=new Example7_2_ShowBoard();
showBoard.showMessage(new Example7_2_OutputEnglish());//向参数传递Example7_2_OutputAlphabet子类Example7_2_OutputEnglish的对象
showBoard.showMessage(new Example7_2_OutputAlphabet() {//向参数传递Example7_2_OutputAlphabet匿名子类的对象
@Override
public void output() {
// TODO Auto-generated method stub
for (char c = 'α'; c < 'ω'; c++) {
System.out.printf("%3c", c);//带3位空格输出
}
}
});
}
}
/*
输出结果:
g h i j k l m n o p q r s t u v w x y α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ
*/
7.2.2 和接口有关的匿名类
(1)Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了接口的类去掉类声明后的类体,称作匿名类
//实现接口类创建对象
new 接口(){
实现接口的匿名类类体
}
(2)如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口中的全部方法
//和接口有关的匿名类例子:
public interface Example7_3_SpeakHello {
void speak();
}
public class Example7_3_HelloMatchine {
public void turnOn(Example7_3_SpeakHello hello) {
hello.speak();
}
}
public class Example7_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Example7_3_HelloMatchine helloMatchine=new Example7_3_HelloMatchine();
helloMatchine.turnOn(new Example7_3_SpeakHello() { //和接口Example7_3_SpeakHello有关的匿名类
@Override
public void speak() {//匿名类体
// TODO Auto-generated method stub
System.out.println("hello!you are welcome!");
}
});
helloMatchine.turnOn(new Example7_3_SpeakHello() {
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("你好,欢迎光临!");
}
});
}
}
/*输出结果:
hello!you are welcome!
你好,欢迎光临!
*/