Java基础_匿名类的理解与使用
一段写在开头的话:
注意,匿名类可以减少代码量,可以使代码变得简洁,但是不好维护,这也是匿名类很少被使用的原因,不过考虑到阅读程序会遇到匿名类这种情况,所以了解一下还是很有必要的。
一、哪里可以使用匿名类?
看一下这个代码:
public class Anonymous {
public static void main(String[] args) {
ShowBorad showBorad = new ShowBorad();
showBorad.showMess(new OutputEnglish());
}
}
abstract class OutoutAlphabet{
//输出字母
public abstract void output();
}
class ShowBorad{
void showMess(OutoutAlphabet show){
show.output();
}
}
class OutputEnglish extends OutoutAlphabet{
//输出英文字母
public void output(){
for(char c = 'a'; c <= 'z'; c++){
System.out.printf("%3c",c);
}
}
}
利用面向抽象类编程方法,我们输出英文字母,如果我们还想输出希腊字母呢?
很多人想到的是直接加一个输出希腊字母类继承抽象类就可以了,类似这样:
public class Anonymous {
public static void main(String[] args) {
ShowBorad showBorad = new ShowBorad();
showBorad.showMess(new OutputEnglish());
System.out.println();
showBorad.showMess(new OutputGreek());
}
}
abstract class OutputAlphabet{
//输出字母
public abstract void output();
}
class ShowBorad{
void showMess(OutputAlphabet show){
show.output();
}
}
class OutputEnglish extends OutputAlphabet{
//输出英文字母
@Override
public void output(){
for(char c = 'a'; c <= 'z'; c++){
System.out.printf("%3c",c);
}
}
}
class OutputGreek extends OutputAlphabet{
//输出希腊字母
@Override
public void output(){
for (char c = 'α'; c<='ω'; c++){
System.out.printf("%3c",c);
}
}
}
有没有一种方法可以不构造一个类,而又能输出希腊字母呢?如果你有这个需求,那就该匿名类上场了。
二、怎么使用匿名类?
public class Anonymous {
public static void main(String[] args) {
ShowBorad showBorad = new ShowBorad();
showBorad.showMess(new OutputEnglish());
System.out.println();
showBorad.showMess(new OutputAlphabet() {
@Override
public void output() {
for (char c = 'α'; c <= 'ω'; c++)
System.out.printf("%3c", c);
}
});
}
}
abstract class OutputAlphabet{
//输出字母
public abstract void output();
}
class ShowBorad{
void showMess(OutputAlphabet show){
show.output();
}
}
class OutputEnglish extends OutputAlphabet{
//输出英文字母
@Override
public void output(){
for(char c = 'a'; c <= 'z'; c++){
System.out.printf("%3c",c);
}
}
}
这里直接使用抽象类的子类类体创建一个子类对象,这里的类体是没有名字的,所以叫做匿名类。
三、匿名类的特点
- 匿名类可以继承也可以重写父类的方法;
- 因为匿名类是在某个类中直接用来创建对象的,所以匿名类是内部类;
- 匿名类可以访问外嵌类中的成员变量和方法;
- 匿名类内部不能有static修饰的变量或方法;
- 由于匿名类是个子类,没有类名,所以在用匿名类创建对象时要使用父类的构造方法。
四、和接口有关的匿名类
当然,java也支持用一个接口名和一个类体来创建一个匿名对象,如果把上述代码作以修改,就变成了下边这个样子:
public class Anonymous {
public static void main(String[] args) {
ShowBorad showBorad = new ShowBorad();
showBorad.showMess(new OutputAlphabet() {
@Override
public void output() {
for(char c = 'a'; c <= 'z'; c++)
System.out.printf("%3c",c);
}
});
System.out.println();
showBorad.showMess(new OutputAlphabet() {
@Override
public void output() {
for (char c = 'α'; c <= 'ω'; c++)
System.out.printf("%3c", c);
}
});
}
}
interface OutputAlphabet{
//输出字母
public abstract void output();
}
class ShowBorad{
void showMess(OutputAlphabet show){
show.output();
}
}
最后还是那句话,简便的不一定好维护,方便的不一定好看懂,对于匿名类,大家酌情考虑使用。