黑马程序员技术交流社区

标题: 多态中一种形式:父类引用指向子类的对象 [打印本页]

作者: zjm10zj    时间: 2013-3-23 19:22
标题: 多态中一种形式:父类引用指向子类的对象
本帖最后由 zjm10zj 于 2013-3-24 22:32 编辑

多态中一种形式:父类引用指向子类的对象,求解释一下,最好能用通俗易懂的示例!谢谢

作者: 张昶    时间: 2013-3-23 19:50
class Father{ void print(){}; } class Son extends Father{ void print(){System.out.println("子类中!");} void show(){System.out.println("show 中!");} } class Demo{ public static void main(String args[]){ Father obj=new Son(); obj.print(); obj.show(); //这个调用会报错! } } 1 .如果你想实现多态,那么必须有三个条件,父类引用,子类对象,方法覆盖 你这里如果Fathor类有一个show()方法,那么形成方法覆盖,那么此时就可以这么写:obj.show(),此刻形成了多态. 2. 没有方法覆盖,那你这里只能解释为父类引用去访问一个子类的方法,当然,父类引用没有这么大范围的权限,当然会报错
作者: 魏福伟    时间: 2013-3-23 19:51
多态,父类引用可以指向子类的对象

  1. public class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Animal animal = new Cat();//父类的引用指向子类对象
  6.                 animal.setName("cat");               
  7.                 animal.getNane();
  8.                 System.out.println("---------------------------");
  9.                 Cat cat1 = new Cat();
  10.                 cat1.setName("cat1");
  11.                 animal = cat1;//子类对象可以直接赋给父类对象(不用向上类型转换,也可以显示的转换)
  12.                 animal.getNane();
  13.                 System.out.println("-------------------");
  14.                 Cat cat2 = (Cat)animal;//必须显示的向下类型转换,不然报错;
  15.                 cat2.getNane();
  16.                
  17.         }
  18. }

  19. class Animal
  20. {
  21.         String name = "Animal";
  22.        
  23.         public void getNane()
  24.         {
  25.                 System.out.println("My name is " + name);
  26.         }

  27.        
  28.         public void setName(String name)
  29.         {
  30.                 this.name = name;
  31.         }
  32.        
  33. }
  34. class Cat extends Animal
  35. {
  36.         public void getNane()///重写父类的方法
  37.         {
  38.                 System.out.println("My name is " + name);
  39.         }
  40. }
复制代码

作者: 宋耀冬    时间: 2013-3-23 19:55
这是毕老师的视频中的代码 ,好好研究一下吧    大家都努力啊


/*
多态:可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗。

猫 x = new 猫();

动物 x = new 猫();

1,多态的体现
        父类的引用指向了自己的子类对象。
        父类的引用也可以接收自己的子类对象。
2,多态的前提
        必须是类与类之间有关系。要么继承,要么实现。
        通常还有一个前提:存在覆盖。

3,多态的好处
        多态的出现大大的提高程序的扩展性。

4,多态的弊端:
        虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5,多态的应用

6,多态的出现代码中的特点(多态使用的注意事项)




第二个问题:如何使用子类特有方法。
*/

/*
动物,
猫,狗。
*/

class Cat extends Animal
{
        public void eat()
        {
                System.out.println("吃鱼");
        }
        public void catchMouse()
        {
                System.out.println("抓老鼠");
        }
}


class Dog extends Animal
{
        public void eat()
        {
                System.out.println("吃骨头");
        }
        public void kanJia()
        {
                System.out.println("看家");
        }
}


class Pig extends Animal
{
        public void eat()
        {
                System.out.println("饲料");
        }
        public void gongDi()
        {
                System.out.println("拱地");
        }
}

//-----------------------------------------


class DuoTaiDemo2
{
        public static void main(String[] args)
        {
                //Animal a = new Cat();//类型提升。 向上转型。
                //a.eat();

                //如果想要调用猫的特有方法时,如何操作?
                //强制将父类的引用。转成子类类型。向下转型。
                ///Cat c = (Cat)a;
                //c.catchMouse();
                //千万不要出现这样的操作,就是将父类对象转成子类类型。
                //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
                //多态自始至终都是子类对象在做着变化。
//                Animal a = new Animal();
//                Cat c = (Cat)a;
               

                /*
                毕姥爷 x = new 毕老师();

                x.讲课();

                毕老师 y = (毕老师)x;


                y.看电影();
                */
                function(new Dog());
                function(new Cat());


        }
        public static void function(Animal a)//Animal a = new Cat();
        {
                a.eat();
                /*
                if(a instanceof Animal)
                {
                        System.out.println("haha");
                }
                else
                */
                if(a instanceof Cat)
                {
                        Cat c = (Cat)a;
                        c.catchMouse();
                }
                else if(a instanceof Dog)
                {
                        Dog c = (Dog)a;
                        c.kanJia();
                }


                /*
                instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)  
                */
       
        }
       


}

作者: 胡国彬    时间: 2013-3-23 20:02
public class DemoParent {
        private String name;

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }
       
}

public class DemoSon extends DemoParent {
        private String name;
        private String age;
       
        public String getAge() {
                return age;
        }

        public void setAge(String age) {
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }
       
}


public class MainClass {

        /**
         * @param args
         */
        public static void main(String[] args) {

                /**
                 * 此处dp就是父类的引用,而后面new的对象就是子类的对象.
                 *
                 * 通俗一点说,就是父类的范围更大,子类可以属于父类.
                 *
                 * 比如,你有一个哥哥,你和你哥哥都是继承于你爸爸.这时候,你爸爸的引用就可以指向你或者你哥哥,因为你们两个都是继承于他
                 */
                DemoParent dp = new DemoSon();
               
                /**
                 * 此处ds就是子类的引用,而后面dp是父类的应用,子类引用要指向父类的对象,就必须要进行强制转换.
                 *
                 * 通俗一点就是说,你的引用现在要指向你爸爸的引用,要进行强转,因为你爸爸的引用可以指向你的对象,也可以指向你哥哥的对象,
                 * 也可以指向他自己的对象,所以,现在你要引用一个范围比你大的对象的引用,也就是你要引用你爸爸的引用,就要强制转换成你自己的对象类型.
                 */
                DemoSon ds = (DemoSon) dp;
                System.out.println(ds.getName());
               
                /**
                 * 总结:父类对象引用子类对象,不需要强制转换,子类对象要引用父类对象,就要先进行强制转换.
                 */
        }

}


作者: 谢冬    时间: 2013-3-23 20:22
我个人的理解:多态就是自动类型提升,比如说我们以前学基本数据类型,short类型转int类型:short s = 3; int i = s;小转大就是自动类型提升,如果把int类型转成short类型,大转小那么就需要强转,比如 int i = 3,short s = (short)i;如果你用一个不存在的类型来接收,编译就会出错,比如说:haha h = 3; int i = h;这就会出错,这里就是为什么父类的引用指向子类对象,如果根本不存在的子类,当然会出错啦
作者: 葛晓红    时间: 2013-3-23 21:48
例如对于代码:Person  a = new Teacher();
父类类型的引用指向子类对象就是说:因为Teacher是继承父类Person,所以我可以定义一个Person类型的引用a,指向新建的Teacher类型的对象。这样父类类型的引用可以调用父类中定义的所有属性和方法,但是不能调用子类中定义而父类中没有的方法。 同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;而对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2