作者: 黑马--张帅 时间: 2012-9-5 21:25
只要子类继承了父类,子类对象都可以向上转型成父类的对象。至于你说的Animal g = new Dog()是父类的引用指向子类对象实现了多态。当想操作大量子类共有的方法是为了更简洁,更容易操作大量子类共有的方法时,Animal g = new Dog()就显得尤为的重要,Animal g这个动物引用类型可以接收所有子类动物。就相当于你想叫一大班人来吃饭,如果你一个一个的叫名字的话就会浪费很多的时间而且没有必有,你可以直接叫“吃饭了”他们都可以接收到这句话,执行吃饭的动作这样就节省了大浪的时间,又很简单。以你这个例子讲讲多态的主要特点和前提吧:
多态:可以理解为事物存在的多种体现形态
abstract class Animal
{
abstract void eat();
}
class Dog extends Animal
{
public void eat()
{
System.out.println("骨头");
}
public void lookHome()
{
System.out.println("看门");
}
}
class Cat extends Animal
{
public void eat()
{
System.out.println("老鼠");
}
public void ZhuaLaoShu()
{
System.out.println("抓老鼠");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
/*Dog d = new Dog();
d.eat();
d.lookHome();
Cat c = new Cat();
c.eat();
c.ZhuanLaoShu();
*/
Animal a = new Dog();//多态 父类的引用指向子类对象,子类对象就被提升为了父类型。
method(a); //这种提升的好处,就是使用父类型对子对象进行操作,提高扩展性
//但是不能使用子对象的特有功能。
Animal b = new Cat();
method(b);
/*
如果要用到子类对象的特有方法时,可以对对象的类型进行强制类型的转换
转型指定的对象的类型就可以使用对象的特有方法了
如:Animal a = new Dog();(向上转型)
Dog d = (Dog)a;(向下强制转型)
转型原则:自始至终其实都是子类对象在做着类型的变化。
*/
}
public static void method(Animal a/*传进来的形式参数是Animal类型的,Dog和Cat都是Animal类型的,这里用了多态*/)
{
a.eat();
/*
对具体的对象进行判断,需要使用一个关键字来完成。
关键字就是:instanceof,
*/
if (a instanceof Dog)
{
Dog d = (Dog)a;
d.lookHome
}
else if (a instanceof Cat)
{
Cat c = (Cat)a;
c.ZhuaLaoShu();
}
}
}作者: 乔九 时间: 2012-9-5 21:34
作为Animal 的子类Dog继承了其方法和属性,而方法中的参数不仅可以使基本数据类型还可以是类类型作者: 吴通 时间: 2012-9-5 21:37
Animal是父类,Dog是子类。也即Dog继承了Animal类,定义一个函数static void doSome(Animal a){}
这个方法参数列表是Animal,就是说只要是Animal类型的参数都能够接收,由于父类是向上抽取共同
之处得到的,所以Dog当然属于Animal类了,所以Dog传进去可以通过。
再有,新建一个对象Animal g=new Dog(); 虽然创建的是Dog,但是对象的类型是Animal,Animal有的
功能Dog都有,所以当用g来调用Animal的功能时完全可以,但是Dog除了有Animal的功能外,还有自己
特有的功能,这是要调用这些功能的话就要强转成Dog类型的。所以这个并不冲突!作者: 武庆东 时间: 2012-9-5 21:44
这就可以说,子类都可以被看作是父类的类型吗?
问题在于毕老师视频中的 Animal g=new Dog();还有什么意义?
--------------------------------------------------------------
第一个问题,子类都可以看做是父类的类型吗?
不能这么理解,子类继承父类,在继承父类的类属性和类方法的同时,还可以创建自己的属性和方法!继承的目的就是对父类的一些属性和功能的扩充,他们谈不上子类是父类的对象类型,也不应该这么理解!
第二个问题: Animal g=new Dog()意义,这里是dog是子类,Animal是父类,发生了向上类型的转换!作者: 郭阳 时间: 2012-9-5 22:22
interface Chongqiwawa{
public void makeLove(String name);
}
class Person{
Chongqiwawa wawa;
public void setWawa(Chongqiwawa wawa){
this.wawa = wawa;
}
private String name;
public void makeLove(){
//调用wawa的makeLove方法
wawa.makeLove(name);
}
现在,你想和wawa那个,就可以这样用了:
main(){
Person you = new Person();
you.makeLove();
}
class USAWawa implements Chongqiwawa{
public void makeLove(String name){
System.output.println(name + " come on! a,a, a...");
}
}
好吧,你已经流口水了,一口价成交,然后带回家,迫不及待实践一下,代码体现为:
main(){
Person you = new Person();
Chongqiwawa wawa = new USAWawa();
you.setWawa(wawa);
you.makeLove();
}
这时候你已经可以和娃娃水乳交融了。不久,你发觉厌倦了美国娃娃,想试下日本娃娃,再次来到成人超市,日本娃娃makeLove功能实现如下:
class JapanWawa implements Chongqiwawa{
public void makeLove(String name){
System.output.println(name + " yemede! a,a, a...ganbade...");
}
}
OK,你直接丢下一堆钞票一句不用找就抱回家了,马上进入主题:
main(){
Person you = new Person();
//获得实际的wawa
Chongqiwawa wawa = new JapanWawa();
you.setWawa(wawa);
you.makeLove();
}
看见了吗,只需改动一行代码,你就实现了娃娃的切换,得到不同的makeLove感受,其他代码都不用改。
这就是接口!