第10章:内部类(二)

标签: 匿名内部类 内部类应用
3人阅读 评论(0) 收藏 举报
分类:

匿名内部类

public interface Contents {
    int value();
}

public class Parcel7 {
    public Contents contents(){
        return new Contents() {
            private int i=11;
            public int value() {
                return i;
            }
        };
    }
    public static void main(String[] args) {
        Parcel7 p = new Parcel7();
        Contents contents = p.contents();
    }
}

contents()方法返回值的生成与表示这个返回值的类的定义结合在一起.另外,这个类是匿名的,它没有名字.更糟的是.看起来似乎是你要创建一个Contents 对象.但是然后(在到达语句结束的分号之前),你却说等一等,我想要在这里插入一个类的定义.
这种奇怪的语法指的是:创建一个继承Contents匿名类的对象.通过new表达式返回的引用被自动向上转型为Contents的引用.上述匿名内部类的语法是下述形式的简化形式.

public class Parcel7 {
    class MyContents implements Contents{
        private int i=11;
        public int value(){
            return i;
        }
    }
    public Contents contents(){
        return new MyContents();
    }
    public static void main(String[] args) {
        Parcel7 p = new Parcel7();
        Contents contents = p.contents();
    }
}
  • 在这个匿名内部类中,使用了默认的构造器来生成Contents.下面代码展示的是,如果你的基类需要一个有参数的构造器,应该怎么办
public class Parcel8 {
    public Wrapping wrapping(int x){
        return new Wrapping(x){
            public int value(){
                return super.value()*47;
            }
        };
    }

    public static void main(String[] args) {
        Parcel8 p = new Parcel8();
        Wrapping wrapping = p.wrapping(10);
    }
}

public class Wrapping {
    private int i;

    public Wrapping(int i) {
        this.i = i;
    }

    public int value() {
        return i;
    }
}

只需要传递合适的参数给基类的构造器即可,这里将x传进new Wrapping(x).尽管Warpping只是一个有具体实现的普通类,但它还是被其导出类当做公共接口来使用:
你会注意到,Wrapping 拥有一个要求传递一个参数的构造器,这使得事情变得更加有趣,在匿名内部类末尾的分号,并不是用来标记内部类结束的,实际上,它标记的是表达式的结束,只不过这个表达式正巧包含类匿名内部类罢了,因此,这与别的地方使用分号是一致的.

-匿名内部类定义字段事,还能够对其执行初始化操作

public class Parcel8 {
    public Destination destination(final String dest) {
        return new Destination() {
            private String label = dest;
            public String readLabel() {
                return label;
            }
        };
    }

    public static void main(String[] args) {
        Parcel8 p = new Parcel8();
        Destination dest = p.destination("Tasmania");
    }
}

匿名内部类,当它使用一个在其外部定义的对象时候,那么编译器会要求其引用的参数是final的,就像你在destination()的参数看到的那样,如果忘记了,将会得到编译时错误.

查看评论

机器学习实战——第十章:K-mean聚类

本系列目的在于总结每一个分类器的特点(优点、缺点、使用数据类型、使用时的注意事项等)。相关代码自己搜。 python:建议使用2.7 python常用函数库:NumPy、sci...
  • mmc2015
  • mmc2015
  • 2015-06-29 19:44:26
  • 1331

python从入门到实践第十章的练习题作业

''' 10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至 此学到的 Python 知识,其中每一行都以“In Python you can”打头。将这个文件命名为 ...
  • czw0723
  • czw0723
  • 2018-03-28 20:35:23
  • 26

《机器学习实战》第十章 :K-均值聚类算法

《机器学习实战》系列博客主要是实现并理解书中的代码,相当于读书笔记了。毕竟实战不能光看书。动手就能遇到许多奇奇怪怪的问题。博文比较粗糙,需结合书本。博主边查边学,水平有限,有问题的地方评论区请多指教。...
  • csdn_lzw
  • csdn_lzw
  • 2017-03-07 21:00:44
  • 657

C++ primer plus 第十章编程练习

1、/******************************************************************************************** Auth...
  • kkkkkkkkq
  • kkkkkkkkq
  • 2017-03-21 10:08:56
  • 485

机器学习(周志华) 参考答案 第十章 降维与度量学习 10.1

机器学习(周志华) 参考答案 第十章 降维与度量学习 10.1机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/detail...
  • icefire_tyh
  • icefire_tyh
  • 2016-08-18 17:28:05
  • 1073

Servlet与JSP核心编程第二版代码1-10章

  • 2008年01月04日 17:27
  • 76KB
  • 下载

与孩子一起学编程10章

这一次,来个有意思的小游戏 滑雪游戏,树是障碍物,拿到旗子有奖励,运行文件需要几个图片 上传在这儿,滑雪者,旗子,树,还有滑雪者左方向的两个,第一个,第二个,有方向的两个,第一个,第二个,滑雪者碰撞树...
  • seckai
  • seckai
  • 2013-08-31 20:47:25
  • 2640

《C++ Primer Plus(第6版)中文版》编程练习答案第6-10章

  • 2014年07月18日 18:44
  • 321KB
  • 下载

UNIX环境高级编程之第10章:信号

10.1 引言 信号是软件中断.很多比较重要的应用程序都需要处理信号.信号提供一种处理异步时间的方法,例如,终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序. 10.2 信...
  • youngyangyang04
  • youngyangyang04
  • 2015-09-20 14:44:09
  • 298

快学scala 第十章 特质 读书笔记及习题答案代码

chapter 10 特质 标签:快学scala 一、笔记 scala和java一样不允许从多个超类继承,scala提供特质而非接口。特质可以同时拥有抽象方法和具体方法,...
  • refuil
  • refuil
  • 2016-07-21 14:10:35
  • 884
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 891
    排名: 5万+
    最新评论