个人对多态的一点理解,不一定完全正确,欢迎大家批评指正。
1.什么是多态
面向对象的三大特性:封装,继承,多态。从某种程度来说,多态是建立在封装和继承的继承之上的。
多态性可以理解为同一个事物的多种表现形态。
1)方法的重载与重写
2)子类对象的多态性:父类的引用指向子类对象(更多的是指这种形式)
父类 f = new 子类();
2.子类对象的多态性使用要求:
1)要有类的继承
2)要有子类对父类方法的重写
3)父类的引用指向资料对象
3.属性没有多态性
下面用一个简单的例子来掩饰一下:
1 //父类 2 public class Person { 3 public void eat(){ 4 System.out.println("人吃饭"); 5 } 6 public void walk(){ 7 System.out.println("人走路"); 8 } 9 } 10 //子类Man 11 public class Man extends Person { 12 public void eat(){ 13 System.out.println("男人吃饭"); 14 } 15 public void walk(){ 16 System.out.println("男人走路"); 17 } 18 public void sleep(){ 19 System.out.println("睡觉"); 20 } 21 } 22 //子类Woman 23 public class Woman extends Person { 24 public void eat(){ 25 System.out.println("女人吃饭"); 26 } 27 public void walk(){ 28 System.out.println("女人走路"); 29 } 30 public void shopping(){ 31 System.out.println("购物"); 32 } 33 } 34 //测试类 35 public class Test{ 36 public static void main(String[] args) { 37 //父类的引用指向子类对象 38 Person p = new Man();//向上转型 即将子类型转换为父类型 39 //虚拟方法调用:通过父类的引用指向子类对象实体,调用方法是执行的是子类重写父类的方法 40 p.eat();//男人吃饭 41 p.walk();//男人走路 42 //p.sleep(); //错误 用父类引用调用了父类不存在的方法 43 Man m = (Man)p;//向下转型 即将父类型转换为子类型,必须强制转换,并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。 44 m.sleep();//睡觉 45 46 Person p1 = new Woman(); 47 //java.lang.ClassCastException 48 //向下转型时,只能转向指向的对象类型 49 //Man m1 = (Man)p1; 50 Woman w = (Woman)p1; 51 } 52 }
通过上面的例子我们可以发现,如果想要调用父类没有的方法,而子类独有的方法时,需要进行强制类型转换。如上面将p强制转换m。
并且转换的时候只能转向指向的对象类型,如p1只能向下转型为Women m1,而不能转型为Man类型
4.使用多态的好处
1)提高了程序的扩展性和维护性
2)具有很强的灵活性
3)简化了代码编写和修改过程
时间: 2024-10-12 20:16:08