你说你是高工,匿名内部类有我玩得6吗?
源码共读
共 2164字,需浏览 5分钟
·
2019-12-18 23:21
黑客技术点击右侧关注,了解黑客的世界!Java开发进阶点击右侧关注,掌握进阶之路!Python开发点击右侧关注,探讨技术话题!
来源丨IT烂笔头(nj_android)
那么我们能不能同时继承一个类和实现一个接口呢?像这样:
那如果我们将内部类换成Interface呢?Interface跟静态内部类的效果一样,就不会引用外部类的实例,所以这时候编译器在定义匿名内部类的构造方法时只会将匿名内部类的外部类实例带入,而不会将内部类的外部类实例带入:
来源丨IT烂笔头(nj_android)
阅读文本大概需要 5 分钟。
1
基础知识
作为一个初级工程师,一般能使用就ok了。public abstract class Test {
abstract void onClick();
}
Test test = new Test() {
@Override
void onClick() {
}
};
Class testClass = Class.forName("包名.OuterClass$1");
System.out.println(testClass);
2
继承结构
那么我们能不能同时继承一个类和实现一个接口呢?像这样:
这种可以吗?在有些语言是支持的,但是呢Java是不支持的。我们知道Java10支持类型推导了,那上面的例子可不可以写成这样呢?Test|OnClickListener testListener = new Test() implements OnClickListener{
...
}
可不可以呢?其实也是不可以的,那有同学就讲了,你在这瞎折腾了半天,都是不可以那还讲干啥?聪明的同学可能能从上面也能吸取到一些知识。比如,你可以去查一下哪些语言支持第一种方式,这里只是给你抛砖引玉用的。从第二种方式中我讲到了Java 10支持了类型推导,那你也可以再去查下Java 10到底新增了哪些新特性是不是?那到底能不能实现呢?当然是可以的,你可以使用Java的local class。感兴趣的读者自行查阅一下哦。如果你是中级工程师掌握到这里就蛮不错的了。var testListener = new Test() implements OnClickListener{
...
}
3
构造方法
那如果我们将内部类换成Interface呢?Interface跟静态内部类的效果一样,就不会引用外部类的实例,所以这时候编译器在定义匿名内部类的构造方法时只会将匿名内部类的外部类实例带入,而不会将内部类的外部类实例带入:
- 由编译器定义
- 构造方法的参数
- 外部类的对象(定义在非静态方法区)
- 父类的外部类的对象(父类是非静态的)
- 父类的构造方法参数
- 外部捕获的变量(方法体引用的局部final变量)
推荐↓↓↓
长
按
关
注
?【16个技术公众号】都在这里!
涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。
万水千山总是情,点个 “在看” 行不行评论