栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352063.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号