多态理解不到位,希望大家指点一下。

时间:2021-04-21 21:53:21
类似于Vector(int a,Object o)这种类,它是要存放对象的,而在未使用这个类之前你是确定不了将要传入一个什么样的类给这个Vector,又因为Object是一切类的父类,所以无论你传入一个什么样的类,只要先向上转型成Object类,然后向外取的时候在向下转型成你传入的那个类就行了。
比如我有一个类Wbs wbs = new Wbs();但是我不明白在这里如果要把wbs装入Vector,wbs具体是怎样向上转型成Object的,是把wbs的引用给了Object吗?还是其它的方法?

26 个解决方案

#1


- -!

#2


Vector(1,wbs);
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。

#3


引用 2 楼 liguominz 的回复:
Vector(1,wbs);
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。

写程序时我知道是这样传,但是我想知道原理,也就是具体怎么传的。

#4


LZ,你还是没有懂上次我给你举的中国人-上海人的例子

#5


我,上海人-中国人。
当我去外国打工的时候,人家说,只招中国人,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)这个方法中就可以根据我传入的类的不同
调用不同类的方法,这就是多态~

#8


而我在ceshi(car obj)方法里面
只需要写car.prin();
系统会自动根据我传入的类不同,调用不同类的方法。

#9


看下底层API

#10


传入时,父类引用指向子类对象

#11


就像liguominz 说的 其实就是Car obj = new RedCar();

#12


引用楼主 wangbaosun 的回复:
类似于Vector(int a,Object o)这种类,它是要存放对象的,而在未使用这个类之前你是确定不了将要传入一个什么样的类给这个Vector,又因为Object是一切类的父类,所以无论你传入一个什么样的类,只要先向上转型成Object类,然后向外取的时候在向下转型成你传入的那个类就行了。
 比如我有一个类Wbs wbs = new Wbs();但是我不明白在这里如果要把wbs装入Vector,wbs具体是怎样向上转型成Object的,是把wbs的引用给了Object吗?还是其它的方法?


你这个跟多态没啥关系吧

就拿那个地球人-中国人-上海人
是上海人,那肯定是中国人,是中国人,那肯定是地球人啊, 继续的话,是地球人那肯定是个人啊

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


引用 5 楼 shine333 的回复:
我,上海人-中国人。
当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
可是翻来覆去,就我一个人。

哈哈,谢谢你,其实你也知道我刚才问了一个同样的问题,现在还是不怎么懂。
我也举个例子。
广东人: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


引用 13 楼 wangbaosun 的回复:
引用 5 楼 shine333 的回复:
 我,上海人-中国人。
 当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
 后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
 再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
 可是翻来覆去,就我一个人。

 哈哈,谢谢你,其实你也知道我刚才问了一个同样的问题,现在还是不怎么懂。
 我也举个例子。
 广东人: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。所以就要转型了,你首先的把自己变成人类,所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?


楼主别动不动就转型嘛,你说的是没错,但理解的不一定正确
接受Object,传入的时候只是传了一个具体实例的一个引用而已,引用的类型是Object
向上是不需要转型的
你拿出来的时候他只认识是个Object,这时候才需要向下重新转回来

所以你要是知道泛型的话,Vector<String>,那就不需要你手动转了

#15


我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。

#16


我看楼主也别钻牛角尖了
多看看写写,感觉来的时候,就不会这么问了

#17


 
believefym,你的奖牌有个性
10月第一
11月第二
12月第三

#18


引用 15 楼 liguominz 的回复:
我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。

呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那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("你好"))

从上面的例子可以回答你的问题“所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?”
转到人类,只代表他是不是广东人,会不会说广东话,和现在的程序无关。

#20


对待这样事情的态度是记住他,忘记他,使用它,然后你就理解了.

#21


引用 18 楼 wangbaosun 的回复:
引用 15 楼 liguominz 的回复:
 我靠,楼主,你无敌了。。。
 不是这样的
 其实就是
 Object object = new Gdr();
 虽然前面定义的是人这个类
 但是指向却是子类广东人,
 无语掉了。。

 呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。


先学会用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


引用 18 楼 wangbaosun 的回复:
[Quote=引用 15 楼 liguominz 的回复:]
我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。



呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。
[/Quote]

我都不知道该怎么给你说了~

#23


多态,就是晚绑定。

#24


这种东西还是要慢慢理解,然后再搞清楚程序编译的原理你就明白了。

#25


引用 22 楼 liguominz 的回复:
 我都不知道该怎么给你说了~

说了这么多算是白说了。。。

#26


解铃还得系令人,谢谢大家了,非常感谢。
让我自己好好想想。呵呵

#1


- -!

#2


Vector(1,wbs);
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。

#3


引用 2 楼 liguominz 的回复:
Vector(1,wbs);
直接这样就可以了,每个类都是继承于object类的,
只不过没有显示而已,所以,你这样直接传就可以了。

写程序时我知道是这样传,但是我想知道原理,也就是具体怎么传的。

#4


LZ,你还是没有懂上次我给你举的中国人-上海人的例子

#5


我,上海人-中国人。
当我去外国打工的时候,人家说,只招中国人,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)这个方法中就可以根据我传入的类的不同
调用不同类的方法,这就是多态~

#8


而我在ceshi(car obj)方法里面
只需要写car.prin();
系统会自动根据我传入的类不同,调用不同类的方法。

#9


看下底层API

#10


传入时,父类引用指向子类对象

#11


就像liguominz 说的 其实就是Car obj = new RedCar();

#12


引用楼主 wangbaosun 的回复:
类似于Vector(int a,Object o)这种类,它是要存放对象的,而在未使用这个类之前你是确定不了将要传入一个什么样的类给这个Vector,又因为Object是一切类的父类,所以无论你传入一个什么样的类,只要先向上转型成Object类,然后向外取的时候在向下转型成你传入的那个类就行了。
 比如我有一个类Wbs wbs = new Wbs();但是我不明白在这里如果要把wbs装入Vector,wbs具体是怎样向上转型成Object的,是把wbs的引用给了Object吗?还是其它的方法?


你这个跟多态没啥关系吧

就拿那个地球人-中国人-上海人
是上海人,那肯定是中国人,是中国人,那肯定是地球人啊, 继续的话,是地球人那肯定是个人啊

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


引用 5 楼 shine333 的回复:
我,上海人-中国人。
当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
可是翻来覆去,就我一个人。

哈哈,谢谢你,其实你也知道我刚才问了一个同样的问题,现在还是不怎么懂。
我也举个例子。
广东人: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


引用 13 楼 wangbaosun 的回复:
引用 5 楼 shine333 的回复:
 我,上海人-中国人。
 当我去外国打工的时候,人家说,只招中国人,OK,我符合条件,因为我是一个中国人。
 后来我回国,又去面试,人家只要上海本地户口,OK,我还符合条件,因为我是上海人。
 再后来,外星人入侵,我参加了地球人的部队,因为我是地球人。
 可是翻来覆去,就我一个人。

 哈哈,谢谢你,其实你也知道我刚才问了一个同样的问题,现在还是不怎么懂。
 我也举个例子。
 广东人: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。所以就要转型了,你首先的把自己变成人类,所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?


楼主别动不动就转型嘛,你说的是没错,但理解的不一定正确
接受Object,传入的时候只是传了一个具体实例的一个引用而已,引用的类型是Object
向上是不需要转型的
你拿出来的时候他只认识是个Object,这时候才需要向下重新转回来

所以你要是知道泛型的话,Vector<String>,那就不需要你手动转了

#15


我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。

#16


我看楼主也别钻牛角尖了
多看看写写,感觉来的时候,就不会这么问了

#17


 
believefym,你的奖牌有个性
10月第一
11月第二
12月第三

#18


引用 15 楼 liguominz 的回复:
我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。

呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那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("你好"))

从上面的例子可以回答你的问题“所以你必须向上转型,转到人类以后不就只会说话和走路了吗?不就不会说广东话了吗?”
转到人类,只代表他是不是广东人,会不会说广东话,和现在的程序无关。

#20


对待这样事情的态度是记住他,忘记他,使用它,然后你就理解了.

#21


引用 18 楼 wangbaosun 的回复:
引用 15 楼 liguominz 的回复:
 我靠,楼主,你无敌了。。。
 不是这样的
 其实就是
 Object object = new Gdr();
 虽然前面定义的是人这个类
 但是指向却是子类广东人,
 无语掉了。。

 呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。


先学会用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


引用 18 楼 wangbaosun 的回复:
[Quote=引用 15 楼 liguominz 的回复:]
我靠,楼主,你无敌了。。。
不是这样的
其实就是
Object object = new Gdr();
虽然前面定义的是人这个类
但是指向却是子类广东人,
无语掉了。。



呵呵,我这块总是理解不好。笨啊,我比你还郁闷。我还有一点不明白。如果按照你上面说的,那object里面应该存储的是广东人这个类的索引或者指针。那为什么用的时候还要向下转型呢?里面存的不是指向广东人的指针吗?直接用不就行了。
[/Quote]

我都不知道该怎么给你说了~

#23


多态,就是晚绑定。

#24


这种东西还是要慢慢理解,然后再搞清楚程序编译的原理你就明白了。

#25


引用 22 楼 liguominz 的回复:
 我都不知道该怎么给你说了~

说了这么多算是白说了。。。

#26


解铃还得系令人,谢谢大家了,非常感谢。
让我自己好好想想。呵呵