Java基础应用_匿名类

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);
        }
    }
}

这里直接使用抽象类的子类类体创建一个子类对象,这里的类体是没有名字的,所以叫做匿名类。

三、匿名类的特点
  1. 匿名类可以继承也可以重写父类的方法;
  2. 因为匿名类是在某个类中直接用来创建对象的,所以匿名类是内部类;
  3. 匿名类可以访问外嵌类中的成员变量和方法;
  4. 匿名类内部不能有static修饰的变量或方法;
  5. 由于匿名类是个子类,没有类名,所以在用匿名类创建对象时要使用父类的构造方法。
四、和接口有关的匿名类

当然,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();
    }
}

最后还是那句话,简便的不一定好维护,方便的不一定好看懂,对于匿名类,大家酌情考虑使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值