面向对象——多态
多态的概述及实现
1、概述:事物存在的多种形态
2、多态的前提
(1)要有继承关系
(2)要有方法重写
(3)要有父类引用指向子类对象
3、案例
public static void main(){ Cat c = new Cat(); c.eat(); Anmal a = new Cat(); //父类引用指向子类对象 a.eat(); //运行结果:猫吃鱼 } class Animal{ public void eat(){ System.out.println("动物吃饭"); } } class Cat extends Animal{ public void eat(){ System.out.printlc("猫吃鱼"); } }
4、多态的成员访问特点之成员变量
编译看父类,运行看父类
public static void main(String[ ] args){ Father f = new Son(); //父类引用指向子类对象 System.out.println(f.num);
Son s = new Son();
System.out.println(s.num); } /* 成员变量 */ class Father{ int num = 10; } class Son extends Father{ int num = 20; }
5、多态中的成员访问特点之成员方法
编译看父类,运行看子类
public static void main(String[ ] args){ Father f = new Son(); f.print(); } class Father{ int num = 10; public void print(){ System.out.println("Father"); } } class Son extends Father{ public void print(){ System.out.println("Son"); } }
6、多态的成员访问特点之静态成员方法
(1)编译看父类,运行看父类
(2)只有非静态的成员方法,编译看左边,运行看右边
public static void main(String[ ] args){ Father f = new Son(); f.method(); //相当于是Father.method() } class Father{ int num = 10; public void print(){ System.out.println("Father"); } } public static void method(){ System.out.println("father static method"); } class Son extends Father{ int num = 20; public void print(){ System.out.println("Son"); } }
7、案例
public static void main(String[] args) { Person p =new SuperMan(); //父类引用指向子类对象,超人提升为了人 System.out.println(p.name); p.谈生意(); } } class Person{ String name = "John"; public void 谈生意() { System.out.println("谈生意"); } } class SuperMan extends Person{ String name = "superman"; public void 谈生意() { System.out.println("谈几个亿的大单子"); } public void fly() { System.out.println("飞出去救人"); } }
8、多态中向上转型和向下转型
public static void main(String[] args) { Person p =new SuperMan(); //父类引用指向子类对象,超人提升为了人 //父类引用指向子类对象就是向上转型 System.out.println(p.name); p.谈生意(); SuperMan sm = (SuperMan)p; //向下转型 /* * 基本数据类型:自动类型提升和强制类型转换 */ int i = 10; byte b = 20; //i = b; //自动类型提升 //b = (byte)i; //强制类型转换 }
9、多态的好处和弊端
(1)好处
提高了代码的维护性(继承保证)
提高了代码的扩展性(由多态保证)
(2)弊端
不能使用子类的特有属性和行为