黑马--程序员 总结 : 多态性 动态连接 动态调用 加典型的例子!

来源:互联网 发布:数据库关系模型举例 编辑:程序博客网 时间:2024/04/28 06:48

 

/*class Parents   //父类{public void print(){System.out.println("Parents");}}class zi extends Parents{public void print(){System.out.println("zi");}}class mother extends Parents{public void print(){System.out.println("mother");}}class text{public void find(Parents p){p.print();}}class Demo{public static void main(String[] args){text t =new text();zi   zi = new zi();mother m = new mother();t.find(zi);t.find(m);}}要理解多态性,首先要知道什么是向上转型我定义了一个子类cat,他继承了Animal类,那么后者就是前者的父类。我可以通过Cat c =new Cat ();实例化一个cat的对象,这个不难理解。但当我这样定义时:Animal  a =new Cat();这代表什么意思呢?很简单,他表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于CAT 是继承自他的父类Animal,所以Animal类型的引用是可以指向CAT类型的对象的。那么这么做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特。定义 一个父类类型的引用指向一个子类的对象,既可以使用子类强大的的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于字类中定义而父类中没有定义的方法,它是无可奈何的;同理,父类中的一个方法只有在父类中定义 而在字类中没有重写的情况下,才可以被父类类型的引用调用。对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。*/class Father{public void func1(){func2();}public void func2(){System.out.println("AAA");}}class child extends Father{public void func1(int i){System.out.println("BBB");}public void func2(){System.out.println("CCC");}}class Demo{public static void main(String[] args){Father child =new child();child.func1();}}总结: 上面是一个很典型多态的例子。子类child继承了父类father,并重载了func1()方法,也重载了func2()方法。重载后func1()和func1(int i)不是在一个方法。父类类型引用child 就不能调用子类中的func1(int i)方法。父类类型引用child 调用func1()该方法时,输出的是父类中的func1(),func1里面运行的又是func2 AAA,但是,子类已经把父类的func2已经覆盖,所以最后输出的是子类中的CCC        1:父类类型引用指向子类类型对象2:该引用只能调用父类中定义的方法和变量3:如果子类中重写了父类中的方法,那么调用该方法时,运行的是子类中的方法。   (动态连接。,动态调用)4:变量不能被重写或者覆盖。重写的概念只针对方法。如果在子类中重写了父类中的变量,那么会抱错。


 

原创粉丝点击