java中匿名类例题的简要分析
在学习java的继承的过程中遇到这样的一个分析类题目,比较有意思,在这里做出简要分析:
//请写出以下程序运行结果:package test;
public class Test {public static void main(String[] args) {Test t = new Test();t.show(new Car(){public void run(){System.out.println("test run"); }});}public void show(Car c){c.run();c.show();
}}
abstract class Car{public void run(){System.out.println("car run"); }public void show(){System.out.println(getClass().getName());
}}
那么,我们可以通过断点的分析:
首先。我们从main函数进入,发现他创建了Test类的一个对象t;
我们在test类中并没有寻找到Test类的构造函数,所以应该是系统默认的构造器,不进行任何的行为;
之后,我们注意一下这一步,首先是t.show()方法,在Test的类中有这么一个方法,不过我们看到show方法是需要传入一个car类的对象,所以他new了一个car对象,离奇的是car对象后面接着一对大括号。
注意到:这里有一个匿名类,用来一次性使用的创建car对象。这样抽象类car才能被以匿名类中的内容实例化。这样,我们就完成了对car类的实例化,得到了一个car类的对象。
- 接着,我们以那个新new的对象作为参数,调用了Test类中的show方法。
而show方法的第一条语句是c.show();注意到我们是通过匿名类创建的对象,而我们是通过匿名类中的重新写的run()方法,所以他又跳回了第六行,输出“test run”;
好的,接下来我们又回到了show方法中,继续调用c.show(),这时,我们回头看匿名类,它里面竟然没有show的方法。。。所以他就只能调用car类的show()方法。
注意到了右侧返回的getName()是"test.Test$1",好吧,test是包名,Test是类名,可以理解!
但是$1就使得不少同学迷惑了。
好的,我们这次打开文件管理系统,找到我们编译的文件所在,发现.java编译后多出了Test$1.class的文件,这个.class是怎么来的呢?对了是匿名类!这里的Test$1这个类名是编译器给它的名字(匿名类没有名字,但是java编译器要给他起个名,才好分辨)而命名的格式就是第一个Test类下面的匿名类的话就叫$1,第二个就是$2。
这样就可以了,程序就结束了!主要涉及了匿名成员类。大家有兴趣(最好可以了解一下)
java中匿名类例题的简要分析相关推荐
- Java中匿名类的两种实现方式
使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...
- java中匿名类的注意细节
abstract class Outer{int num;public Outer(int x){num = x;}public abstract void show1();public abstra ...
- 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...
[多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...
- java中的类和对象(重点)超详细
java中的类和对象 1.类与对象的初步认知 2.类和对象的实例化 3.类的成员 3.1.字段,属性,成员变量 3.2.方法 3.3.static 关键字 3.4.小结 4.封装 4.1.privat ...
- java 接口不是不能new吗?- java:使用匿名类直接new接口
java 接口不是不能new吗? 这叫匿名内部类,你后面的大括号实际上就是一个Runnable的实现类了 只不过这个类名和接口名称一样,所以是匿名的,别人地方也用不了 这种写法相当于先创建了一个匿名类 ...
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
- java udp类_UDP及java中的类
UDP及java中的类 类DatagramSocket DatagramPacket 1.客户端: (1) 创建客户端 DatagramSocket类 (2)准备数据 字节数组 (3)打包 Datag ...
- 一文读懂Java中File类、字节流、字符流、转换流
一文读懂Java中File类.字节流.字符流.转换流 第一章 递归:File类: 1.1:概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. ...
最新文章
- Log4j每天、每小时、每分钟定时生成日志文件
- sharepoint的入门知识
- 阿里内推题——物流派送员送快递最短路径问题
- java 和c 比优势_Java和C++各有什么优势。
- Windows 手动触发 BSOD
- 特征选择的工程方法?
- 夸奖对方代码写的好_我写出这样干净的代码,老板直夸我
- 关注C-RAN 的五大理由
- OA项目之Mybatis多表链接查询
- 因為 because、since 、as、for、because of、owing to、due to
- 【Unity2D】Sprite 或图片格式常用设置
- 计算机突然无法连接网络,win7电脑突然不能上网的四种解决方案
- 深度学习在图像分类中的发展
- 微信开发:申请测试公众号
- 计算机辅助数控编程交互图形,第8章-计算机辅助数控编程.ppt
- MYSQL UNION 同列类型不同时的处理方法
- pycharm 格式化html文件
- 七、MySQL之数据定义语言(二)
- Paul Zindel【保罗·金代尔】
- Xamarin.android 重写axml控件