A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张 涛 中级黑马   /  2012-9-15 12:11  /  1431 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张 涛 于 2012-9-23 07:14 编辑

一段代码:
  1. Thread th1 = new Thread(){
  2. @Override
  3. public void run() {
  4. System.out.println("thread");
  5. }
  6. };
复制代码
上面这段代码是新起一个线程,用的是匿名内部类。
我不明白的是,这明明是new了一个Thread啊,怎么new的这个Thread就是Thread的子类了呢?
源码中Thread的构造方法的代码:
  1. public Thread() {
  2. init(null, null, "Thread-" + nextThreadNum(), 0);
  3. }
复制代码
调用的init的代码:
  1. private void init(ThreadGroup g, Runnable target, String name,
  2. long stackSize) {
  3. Thread parent = currentThread();
复制代码
下面还很长,就不贴了。这里倒是有个Thread,叫parent,但他获得的是当前线程,也不是新起的线程啊。

问题:
匿名内部类,怎么成为该类的子类了?这个用法很常见,但一直不懂。





评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 马睿 于 2012-9-15 12:25 编辑
  1. class A
  2. {
  3.     Thread d = new myThread()
  4.     {
  5.         void show()
  6.         {
  7.             
  8.         }
  9.     }.show();
  10. }

  11. abstract class myThread extends Thread
  12. {
  13.     abstract void show() ;
  14. }
复制代码
回复 使用道具 举报
一段代码:

    Thread th1 = new Thread(){
    @Override
    public void run() {
    System.out.println("thread");
    }
    };

复制代码
上面这段代码是新起一个线程,用的是匿名内部类。
我不明白的是,这明明是new了一个Thread啊,怎么new的这个Thread就是Thread的子类了呢?
匿名内部类,怎么成为该类的子类了?这个用法很常见,但一直不懂。
解答:Thread是一个抽象类,是不能进行new产生对象的。这里用到用到的知识是,类的类型的向上转换,即把子类的实例对象的地址的引用赋值给了父类对象。
对象的多态性主要分为以下两种类型:
    1.向上转型 子类对象--->父类对象  格式: 父类 父类对象=子类实例;这个体中就是这样的例子
    2.向下转型  父类对象-->子类对象   格式: 子类 子类对象=(子类)父类实例
发生向上转型的调用后,调用的方法一定是被子类覆写过的方法,也就是说,如果对象发生了向上转型后,所有的方法一定是被子类覆写过的方法。


回复 使用道具 举报
Thread th1 = new Thread(){//这一句体现多态

@Override

public void run() {

System.out.println("thread");

}

};
拆开就是这样的
ExtendThread extends Thread{
public void run(){
}
}
Thread th1 =new ExtendThread();

那个new Thread就是匿名的。
回复 使用道具 举报
知道当时不想回答没动力了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马