VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • Java学习笔记(十一)面向对象---多态

父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。

1|1代码体现



abstract class Animal { public abstract void eat(); } class Cat extends Animal { @Override public void eat() { System.out.println("eat fish"); } } class Dog extends Animal { @Override public void eat() { System.out.println("eat bone"); } } class Monkey extends Animal { @Override public void eat() { System.out.println("eat banana"); } } public class Demo { public static void main(String[] args) { /* Animal c = new Cat(); function(c); */ function(new Cat()); /* Animal d = new Dog(); function(d); */ function(new Dog()); /* Animal m = new Monkey(); function(m); */ function(new Monkey()); } public static void function(Animal a) { a.eat(); } }
 
 

运行结果


eat fish eat bone eat banana
 
 

2|0多态的前提

必须是类与类之间有关系。要么是继承关系,要么实现。 存在复写关系。

3|0多态利弊

3|1利处

多态的出现大大地提高了程序的拓展性。

3|2弊端

提高了拓展性,但是只能使用父类的引用访问父类中的成员,不能预先访问子类的成员(因为子类这时还不存在)。

4|0多态-示例


abstract class Student { public void eat() { System.out.println("eat rice"); } public abstract void study(); } class StudentToDo { public void Do(Student s) { s.eat(); s.study(); } } class StudentClass1 extends Student { @Override public void eat() { System.out.println("eat steak"); } @Override public void study() { System.out.println("study English"); } } class StudentClass2 extends Student { @Override public void study() { System.out.println("study Chinese"); } } class StudentClass3 extends Student { @Override public void study() { System.out.println("study Japanese"); } } public class Demo2 { public static void main(String[] args) { StudentToDo std = new StudentToDo(); std.Do(new StudentClass1()); std.Do(new StudentClass2()); std.Do(new StudentClass3()); } }
 
 

运行结果:


eat steak study English eat rice study Chinese eat rice study Japanese
 
 

5|0多态的出现 代码中的特点(多态使用的注意事项)

5|1多态中成员函数的特点

在编译时期,参阅引用类型变量所属的类中是否有调用的方法,如果有编译通过,如果没有编译失败。 在运行时期,参阅对象所属的类中是否有调用的方法。 简单总结:成员函数在多态调用时,编译看左边,运行看右边。


class Fu { void method1() { System.out.println("Fu_Method_1"); } void method2() { System.out.println("Fu_Method_2"); } } class Zi extends Fu { @Override void method1() { System.out.println("Zi_Method_1"); } void method3() { System.out.println("Zi_Method_3"); } } public class Demo3 { public static void main(String[] args) { Fu f =new Zi(); f.method1(); f.method2(); //f.method3(); 对于引用类型f所属的类Fu中没有method3()方法,所以编译会不通过。 } }
 
 

运行结果:


Zi_Method_1 Fu_Method_2
 
 

5|2多态中成员变量的特点

无论编译还是运行,都参考左边(引用型变量所属的类)


class Fu { int num = 1; } class Zi extends Fu { int num = 2; } public class Demo4 { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.num); //参考左边 Zi z= new Zi(); System.out.println(z.num); } }
 
 

运行结果:


相关教程