zoukankan      html  css  js  c++  java
  • Java中接口式的匿名内部类的构造方法

    在使用多线程的时候,时常会使用两种方式实现,一种是直接继承Thread类来实现多线程,另外一种就是实现Runnable接口。

    我们都知道,接口是没有构造方法的,同时匿名内部类也是没有构造方法的。原因有这几点:1.接口只是一个声明,需要有一个实现类实现这个接口。2.匿名内部类是匿名了,也就是说没有类名,所以就没有构造方法。

    但是我们在new一个接口的时候常常会使用这种方式,就是用匿名内部类的方式去实现。

     1  Runnable runnable=new Runnable() {
     2             
     3             @Override
     4             public void run() {
     5                 for(int i=0;i<50;i++){
     6                     System.out.println(i);
     7                 }
     8             }
     9             
    10         };

    在这里有一个new Runable(){},就是这里的Runnable(),这不就是构造方法吗?怎么会出现一个构造方法?

    这时候突然想到一点就是Java所有的类都会默认继承一个Object类,而接口也是一个类,匿名内部类也是一个类,所以我就想是不是这里继承了Object,之后我在代码中加入了toString方法来确定是否含有Object类的内容。

     1 Runnable runnable=new Runnable() {
     2 
     3             @Override
     4             public void run() {
     5                 for(int i=0;i<50;i++){
     6                     System.out.println(i);
     7                 }
     8             }
     9             
    10             @Override
    11             public String toString(){
    12                 return "hello";
    13             }
    14 
    15         };

    在这里使用了@Override注解证明了使用了Object法,另一个验证就是运行程序会发现内有重写方法的时候是类名和哈希值,改写后输出的是“Hello”。

    那么我们就可以猜想,如果Runnable()调用了,是不是就证明了这时的Runnable向上转型成了Object类型,那么这里实际上调用了Object类中的构造方法,为了验证这一点我使用了IDEA的跟踪代码功能。发现使用super关键字的时候,代码跟踪到了Object方法,基本确定了这时调用了Object的构造方法。

    =========================================

  • 相关阅读:
    winfrom绘制渐变 / 调用浏览器访问指定地址
    解决sever 2008中tomcat的报错 init Failed to initialize end point associated with ProtocolHandler ["http-nio-80"]
    SizeGripStyle 枚举
    不安全代码只会在使用/unsafe 编译的情况下出现
    VS2017自定义代码片段, 实现快捷输入
    C#获取程序代码执行时长
    C#简单操作XML
    数据库基线检查工具DB_BASELINE
    SQLmap使用手册小结(二)
    SQLmap使用手册小结(一)
  • 原文地址:https://www.cnblogs.com/Summer7C/p/5245368.html
Copyright © 2011-2022 走看看