黑马程序员技术交流社区
标题:
两个小问题,一个线程,一个集合类
[打印本页]
作者:
李东城
时间:
2013-2-6 14:04
标题:
两个小问题,一个线程,一个集合类
1. c1.start();c2.start();c3.start();
c1.join();c2.join();c3.join();
三个线程,同时调用join方法,那是不是c1先运行完然后再运行c2,然后再运行c3??还是JVM有选择权,从三个中选一个。。。
2. SuperClass m=new ChildClass();
CollectionSuperClass<Father> c=new
CollectionSuperClass<Child>();
假设存在这四个类,然后分别new出来m和c这两个对象,第一个不会报错,因为是父类引用指向子类对象,但是第二个就会报错,需要类型转换,我 不懂为什么第二个需要转换。。。这两个有什么区别??
作者:
陈科宇
时间:
2013-2-6 14:33
我先来回答你第一个问题。由于你没有贴出完整代码,我只能以
c1.start();c2.start();c3.start();
c1.join();c2.join();c3.join();
均写在main方法里来解释。其实c1,c2,c3之间的关系不是你理解的那样,不要把自己绕晕。由于是在main线程里调用了3个线程的join方法,那么很直接的逻辑是main线程会等待c1,c2,c3执行完成之后方能执行。至于c1,c2,c3之前,就没有明确的执行先后关系了,如果它们的优先级别一致的话。
作者:
陈科宇
时间:
2013-2-6 14:41
SuperClass m=new ChildClass();//这体现了java的多态性
CollectionSuperClass<Father> c=new
CollectionSuperClass<Child>();
下面这个,主要是理解上有点偏差。泛型,就是确定集合装载数据的类型。而你在声明集合的时候,确定的类型为Father类型,那么你new
的时候,泛型也必须是Father型。你可能会说是不是不支持多态了。不是的,因为你先在还没有放入对象进去。当你放入元素的时候,多态性和继承性就体现出来了。你既可以装载Father类型对象,也可以装载Child类型对象,还可以装载声明为Father,而实例化化为Child的对象。希望我的回答对你有帮助。
作者:
吴在强
时间:
2013-2-6 15:37
第一个问题解答:
平优先级的线程,执行顺序是随机的,有JVM管理,没有一定的顺序。所以,你上面的 c1.join();c2.join();c3.join();
执行顺序是不一定的。虽然优先级高的线程执行的机率高,但是不代表优先级高就可以先执行,这样看谁先取得cpu的资源!
第二个问题解答:
SuperClass m=new ChildClass();
CollectionSuperClass<Father> c= new CollectionSuperClass<Child>();
多态你应该理解了,这里就不解释,这里涉及到泛型安全问题。假设有三个类,父类是Perons,它里面有一个
public void person(Person<>)
Student和worker都继承这个Person类,如果
CollectionSuperClass<Father> c= new CollectionSuperClass<Child>()在JAVA机制里面允许的话,它就会出现泛型安全问题。
可以用反证法跟你说吧!就拿你这个例子说明吧,假设它还有一个子类Son,父类型泛型的应用可以执行子类型泛型的对象,
可以生产C这个对象,当你调用这个public void test(ColectionSuperClass<Father> c){}方法时(假设它存在),假设你向这个方法中
传递这个参数CollectionSuperClass<Father> c= new CollectionSuperClass<Child>()对象C,它也有一个fahter.add(new Son())方法(假设它存在)
,Son是Fahter的子类,fahter可以调用add(new Son()),但是你传进来的这个C虽然是Father类型的,但是他是Child类型的对象,
你向一个Son类型对象的方法传递了其他对象,这在java里面是不允许的。虽然拥有共同父类,但是这两个子类跟本没有什么直接联系,它们之有和它们共同的父类有联系
这回你可以想通了吧!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2