new Thread(new Runnable() { @Override public void run() { for(int i = 0;i<=40;i++){ ticket.sell(); } } },"C").start();
Runnable是一个接口,Thread需要一个实现Runnable接口的对象,而我们这种写法中发现我们直接new了接口,给我们一种接口可以new的错觉。
其实不是的,其实这是一种匿名内部类的写法,new之后的括号中其实可以看做你写了一个类,实现了这个接口,重写了方法,只不过这个类是匿名的,没有名字,所以称为匿名内部类。
并且对象的创建最终都是需要调用构造方法,接口中是没有构造方法的,类中显示声明构造方法,但默认有空参构造方法,接口中是没有的
所以接口是不能够new的,只是匿名内部类的应用
转载链接:https://blog.csdn.net/CPrimer0/article/details/114802249
三个问题:
1.就是重新创建一个类,然后实现接口,但是需要new这个类对象的时候向上转型吗?
2.还是说不需要向上转型,只需要实现接口的对象就可以了?
3.然后可以向上转型吗?
回答:
1.首先涉及到了多态,编译类型在左边,运行类型在右边。只要你实现了接口,可以直接用实现类对象传入,不需要向上转型。
2.是的,也可以向上转型再传入,都是没问题的
3.可以的