比如我有一个类Wbs wbs = new Wbs();但是我不明白在这里如果要把wbs装入Vector,wbs具体是怎样向上转型成Object的,是把wbs的引用给了Object吗?还是其它的方法?
26 个解决方案
#1
- -!
#2
Vector(1,wbs);
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。
#3
写程序时我知道是这样传,但是我想知道原理,也就是具体怎么传的。
#4
LZ,你还是没有懂上次我给你举的中国人-上海人的例子
#5
我,上海人-中国人。
当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
可是翻来覆去,就我一个人。
当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
可是翻来覆去,就我一个人。
#6
public class car {
public car(){
}
}
public class redcar extends car {
public redcar(){
}
}
public class backcar extends car {
public backcar(){
}
}
public class test {
public void ceshi(car obj){
}
public static void main(String [] args){
test tt = new test();
redcar rc = new redcar();
backcar bc = new backcar();
tt.ceshi(rc);
tt.ceshi(bc);
}
}
#7
上面那段代码中,
test类的ceshi(car obj)这个方法
只要是继承了car类的类都可以传入进去
如果有在car类中有一个方法,
假如是public void prin(){}
没有任何类容,我在redcar类和backcar类中
都重写了这个方法,那么
我在ceshi(car obj)这个方法中就可以根据我传入的类的不同
调用不同类的方法,这就是多态~
test类的ceshi(car obj)这个方法
只要是继承了car类的类都可以传入进去
如果有在car类中有一个方法,
假如是public void prin(){}
没有任何类容,我在redcar类和backcar类中
都重写了这个方法,那么
我在ceshi(car obj)这个方法中就可以根据我传入的类的不同
调用不同类的方法,这就是多态~
#8
而我在ceshi(car obj)方法里面
只需要写car.prin();
系统会自动根据我传入的类不同,调用不同类的方法。
只需要写car.prin();
系统会自动根据我传入的类不同,调用不同类的方法。
#9
看下底层API
#10
传入时,父类引用指向子类对象
#11
就像liguominz 说的 其实就是Car obj = new RedCar();
#12
你这个跟多态没啥关系吧
就拿那个地球人-中国人-上海人
是上海人,那肯定是中国人,是中国人,那肯定是地球人啊, 继续的话,是地球人那肯定是个人啊
service(People p)
那这个接口是不是能接受所有是People的对象?那无论传个什么人,不都可以吗?
你的Vector既然能放Object,当然能放任何的object了
vector.add("abc");
vector.add(new Integer(123));
当然都是可以的,拿出来的时候只知道这是一个Object,具体的类型就要强制转换一下了,但这并不是说把一个Object转成了String(或Integer),而是本来就是String么,否则就是castException
------
多态是这样的
class People {
public void sayHello(){}
}
class Shanghai extends People{
public void sayHello(){System.....println("Hi, I'm from Shanghai");}
}
class Hangzhou extends People{
public void sayHello(){System.....println("Hi, I'm from Hangzhou");}
}
People p = new Shanghai();
People p2 = new Hangzhou();
p.sayHello();//Hi, I'm from Shanghai
p2.sayHello();//Hi, I'm from Hangzhou
#13
哈哈,谢谢你,其实你也知道我刚才问了一个同样的问题,现在还是不怎么懂。
我也举个例子。
广东人:Gdr
上海人:Shr
辽宁人:Lnr
人 :Object
Public Object{
zl(){//走路
}
sh(){//说话
}
}
Public Gdr extends Object{
sgdh(){//说广东话
}
}
Public Shr{}.....
Public Lnr{}.....
现在Gdr、Shr、Lnr他们要向Vector()里面传了,但是Vector里面只接受“人”也就是Object,而你要传入的是Gdr、Shr、Lnr。所以就要转型了,你首先的把自己变成人类,所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?
#14
楼主别动不动就转型嘛,你说的是没错,但理解的不一定正确
接受Object,传入的时候只是传了一个具体实例的一个引用而已,引用的类型是Object
向上是不需要转型的
你拿出来的时候他只认识是个Object,这时候才需要向下重新转回来
所以你要是知道泛型的话,Vector<String>,那就不需要你手动转了
#15
我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。
#16
我看楼主也别钻牛角尖了
多看看写写,感觉来的时候,就不会这么问了
多看看写写,感觉来的时候,就不会这么问了
#17
believefym,你的奖牌有个性
10月第一
11月第二
12月第三
#18
呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。
#19
OK,一般在编程的时候,涉及到Vector或者数组,表名这个Vector或者数组中的内容有其共性。也就是说,取出来的时候,应当知道他们都是某一类的。
比如,我有一个Vector,是宴请的宾客名单。一共100个人,具体有中国人,外国人,上海人,广东人都有,各色人等不一而足,但是他们都是人,而且都会吃。
现在,你已经知道Vector里面可以放Object,取出来也是Object,没办法调用Human里面的eat()方法,但是由于我思维非常正常(LZ现在钻牛角尖,属于不正常阶段)我绝对不会把一只猫,一辆卡车放进去。所以从Vector中取出来的时候,我只需要从Object->Human,就能够让他们吃了。
还是这100个人,现在的功能是开办培训班,让中国人教外国人学中文。那么,这个时候,刚才一个Vector显然无法使用,要么分为Vector teachers放所有中国老师,Vector students放所有外国学生,或者其他解决方案。放入teachers的,取出来,Object->Chinese, 放入students的,取出来Object->Human(假设Human都可以调用speak("你好"))
从上面的例子可以回答你的问题“所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?”
转到人类,只代表他是不是广东人,会不会说广东话,和现在的程序无关。
比如,我有一个Vector,是宴请的宾客名单。一共100个人,具体有中国人,外国人,上海人,广东人都有,各色人等不一而足,但是他们都是人,而且都会吃。
现在,你已经知道Vector里面可以放Object,取出来也是Object,没办法调用Human里面的eat()方法,但是由于我思维非常正常(LZ现在钻牛角尖,属于不正常阶段)我绝对不会把一只猫,一辆卡车放进去。所以从Vector中取出来的时候,我只需要从Object->Human,就能够让他们吃了。
还是这100个人,现在的功能是开办培训班,让中国人教外国人学中文。那么,这个时候,刚才一个Vector显然无法使用,要么分为Vector teachers放所有中国老师,Vector students放所有外国学生,或者其他解决方案。放入teachers的,取出来,Object->Chinese, 放入students的,取出来Object->Human(假设Human都可以调用speak("你好"))
从上面的例子可以回答你的问题“所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?”
转到人类,只代表他是不是广东人,会不会说广东话,和现在的程序无关。
#20
对待这样事情的态度是记住他,忘记他,使用它,然后你就理解了.
#21
先学会用Object:
Vector v = new Vector();
v.add(new Gdr());
Gdr g = (Gdr) v.get(0);
然后再学泛型:
Vector<Gdr> v = new Vector<Gdr>();
v.add(new Gdr());
Gdr g = v.get(0);
代表这里面只能放广东人(包括其子类型:广州人,潮州人,深圳人都可以)
#22
呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。
[/Quote]
我都不知道该怎么给你说了~
#23
多态,就是晚绑定。
#24
这种东西还是要慢慢理解,然后再搞清楚程序编译的原理你就明白了。
#25
说了这么多算是白说了。。。
#26
解铃还得系令人,谢谢大家了,非常感谢。
让我自己好好想想。呵呵
让我自己好好想想。呵呵
#1
- -!
#2
Vector(1,wbs);
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。
#3
写程序时我知道是这样传,但是我想知道原理,也就是具体怎么传的。
#4
LZ,你还是没有懂上次我给你举的中国人-上海人的例子
#5
我,上海人-中国人。
当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
可是翻来覆去,就我一个人。
当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
可是翻来覆去,就我一个人。
#6
public class car {
public car(){
}
}
public class redcar extends car {
public redcar(){
}
}
public class backcar extends car {
public backcar(){
}
}
public class test {
public void ceshi(car obj){
}
public static void main(String [] args){
test tt = new test();
redcar rc = new redcar();
backcar bc = new backcar();
tt.ceshi(rc);
tt.ceshi(bc);
}
}
#7
上面那段代码中,
test类的ceshi(car obj)这个方法
只要是继承了car类的类都可以传入进去
如果有在car类中有一个方法,
假如是public void prin(){}
没有任何类容,我在redcar类和backcar类中
都重写了这个方法,那么
我在ceshi(car obj)这个方法中就可以根据我传入的类的不同
调用不同类的方法,这就是多态~
test类的ceshi(car obj)这个方法
只要是继承了car类的类都可以传入进去
如果有在car类中有一个方法,
假如是public void prin(){}
没有任何类容,我在redcar类和backcar类中
都重写了这个方法,那么
我在ceshi(car obj)这个方法中就可以根据我传入的类的不同
调用不同类的方法,这就是多态~
#8
而我在ceshi(car obj)方法里面
只需要写car.prin();
系统会自动根据我传入的类不同,调用不同类的方法。
只需要写car.prin();
系统会自动根据我传入的类不同,调用不同类的方法。
#9
看下底层API
#10
传入时,父类引用指向子类对象
#11
就像liguominz 说的 其实就是Car obj = new RedCar();
#12
你这个跟多态没啥关系吧
就拿那个地球人-中国人-上海人
是上海人,那肯定是中国人,是中国人,那肯定是地球人啊, 继续的话,是地球人那肯定是个人啊
service(People p)
那这个接口是不是能接受所有是People的对象?那无论传个什么人,不都可以吗?
你的Vector既然能放Object,当然能放任何的object了
vector.add("abc");
vector.add(new Integer(123));
当然都是可以的,拿出来的时候只知道这是一个Object,具体的类型就要强制转换一下了,但这并不是说把一个Object转成了String(或Integer),而是本来就是String么,否则就是castException
------
多态是这样的
class People {
public void sayHello(){}
}
class Shanghai extends People{
public void sayHello(){System.....println("Hi, I'm from Shanghai");}
}
class Hangzhou extends People{
public void sayHello(){System.....println("Hi, I'm from Hangzhou");}
}
People p = new Shanghai();
People p2 = new Hangzhou();
p.sayHello();//Hi, I'm from Shanghai
p2.sayHello();//Hi, I'm from Hangzhou
#13
哈哈,谢谢你,其实你也知道我刚才问了一个同样的问题,现在还是不怎么懂。
我也举个例子。
广东人:Gdr
上海人:Shr
辽宁人:Lnr
人 :Object
Public Object{
zl(){//走路
}
sh(){//说话
}
}
Public Gdr extends Object{
sgdh(){//说广东话
}
}
Public Shr{}.....
Public Lnr{}.....
现在Gdr、Shr、Lnr他们要向Vector()里面传了,但是Vector里面只接受“人”也就是Object,而你要传入的是Gdr、Shr、Lnr。所以就要转型了,你首先的把自己变成人类,所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?
#14
楼主别动不动就转型嘛,你说的是没错,但理解的不一定正确
接受Object,传入的时候只是传了一个具体实例的一个引用而已,引用的类型是Object
向上是不需要转型的
你拿出来的时候他只认识是个Object,这时候才需要向下重新转回来
所以你要是知道泛型的话,Vector<String>,那就不需要你手动转了
#15
我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。
#16
我看楼主也别钻牛角尖了
多看看写写,感觉来的时候,就不会这么问了
多看看写写,感觉来的时候,就不会这么问了
#17
believefym,你的奖牌有个性
10月第一
11月第二
12月第三
#18
呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。
#19
OK,一般在编程的时候,涉及到Vector或者数组,表名这个Vector或者数组中的内容有其共性。也就是说,取出来的时候,应当知道他们都是某一类的。
比如,我有一个Vector,是宴请的宾客名单。一共100个人,具体有中国人,外国人,上海人,广东人都有,各色人等不一而足,但是他们都是人,而且都会吃。
现在,你已经知道Vector里面可以放Object,取出来也是Object,没办法调用Human里面的eat()方法,但是由于我思维非常正常(LZ现在钻牛角尖,属于不正常阶段)我绝对不会把一只猫,一辆卡车放进去。所以从Vector中取出来的时候,我只需要从Object->Human,就能够让他们吃了。
还是这100个人,现在的功能是开办培训班,让中国人教外国人学中文。那么,这个时候,刚才一个Vector显然无法使用,要么分为Vector teachers放所有中国老师,Vector students放所有外国学生,或者其他解决方案。放入teachers的,取出来,Object->Chinese, 放入students的,取出来Object->Human(假设Human都可以调用speak("你好"))
从上面的例子可以回答你的问题“所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?”
转到人类,只代表他是不是广东人,会不会说广东话,和现在的程序无关。
比如,我有一个Vector,是宴请的宾客名单。一共100个人,具体有中国人,外国人,上海人,广东人都有,各色人等不一而足,但是他们都是人,而且都会吃。
现在,你已经知道Vector里面可以放Object,取出来也是Object,没办法调用Human里面的eat()方法,但是由于我思维非常正常(LZ现在钻牛角尖,属于不正常阶段)我绝对不会把一只猫,一辆卡车放进去。所以从Vector中取出来的时候,我只需要从Object->Human,就能够让他们吃了。
还是这100个人,现在的功能是开办培训班,让中国人教外国人学中文。那么,这个时候,刚才一个Vector显然无法使用,要么分为Vector teachers放所有中国老师,Vector students放所有外国学生,或者其他解决方案。放入teachers的,取出来,Object->Chinese, 放入students的,取出来Object->Human(假设Human都可以调用speak("你好"))
从上面的例子可以回答你的问题“所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?”
转到人类,只代表他是不是广东人,会不会说广东话,和现在的程序无关。
#20
对待这样事情的态度是记住他,忘记他,使用它,然后你就理解了.
#21
先学会用Object:
Vector v = new Vector();
v.add(new Gdr());
Gdr g = (Gdr) v.get(0);
然后再学泛型:
Vector<Gdr> v = new Vector<Gdr>();
v.add(new Gdr());
Gdr g = v.get(0);
代表这里面只能放广东人(包括其子类型:广州人,潮州人,深圳人都可以)
#22
呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。
[/Quote]
我都不知道该怎么给你说了~
#23
多态,就是晚绑定。
#24
这种东西还是要慢慢理解,然后再搞清楚程序编译的原理你就明白了。
#25
说了这么多算是白说了。。。
#26
解铃还得系令人,谢谢大家了,非常感谢。
让我自己好好想想。呵呵
让我自己好好想想。呵呵