黑马程序员技术交流社区

标题: 父类引用 指向子类对象?怎么理解? [打印本页]

作者: qijia004    时间: 2016-3-6 00:00
标题: 父类引用 指向子类对象?怎么理解?
谁能告诉我  父类引用指向子类对象   具体是为什?我知道这是什么东西   但是理解不了
这么做有什么用?
:多态的好处:可以当作形式参数,可以接收任意子类对象   这句又怎么理解?
文字的东西我都知道  就是理解不了
作者: mimi5566    时间: 2016-3-6 19:24
关于这个问题其实就是多态的用法楼主不太懂。
关于你说的父类引用指向子类对象以及父类可以当作形式参数,可以接收任意子类对象,这些都是java中多态的表现形式。举个例子
//Animal是父类
public class Animal {
        public void walk(){
                System.out.println("父类Animal走路");
        }
        public static void animalWalk(Animal animal){
                animal.walk();
        }
        public static void main(String[] args) {
                Animal animal = new Dog();//父类对象的引用但是实际指向的是子类
                animal.walk();//调用产生子类的方法
                Cat cat = new Cat();//Cat对象
                Animal.animalWalk(cat);//调用一个类静态方法,因为参数是父类,所以所有的子类对象都可以传入。这就是楼主说的“父类可以当作形式参数,可以接收任意子类对象
        }
}
//Dog定义了子类
public class Dog extends Animal{
        public void walk(){
                System.out.println("子类Dog走路");
        }
        public void talk(){
                System.out.println("Dog talk");
        }
}


//Cat另一个子类
public class Cat extends Animal{
        public void walk(){
                System.out.println("子类Cat走路");
        }
}

最后我在多说一点,java中的多态的实现是因为java是一门动态语言,什么意思呢?楼主应该知道java的反射,但是楼主是否想过这个是怎么实现的,其实两者的实现原理是相同的。因为java是一门后期绑定语言,就是说你的代码虽然定义的是Animal,但是这个对象animal真正的引用时什么是在编译器编译的时候才知道,编译器编译后会将你真正的引用地址付给animal对象,所以直到代码真正运行你的对象才知道自己真正是谁,同样的java的反射也是这样,运行时你还可以对代码进行操作就是这个道理。打个不恰当的比较就是,虽然女人已经怀孕,但是你出生前只能知道小宝宝是个人,不能知道他是男孩还是女孩(不借助外界帮助),只有真正出生了,什么事情都知道了。  不知道我这么说,楼主是否明白。







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