多态
多态概述
-
同一个对象,在不同时刻表现出来不同形态
-
举例:
- 猫
- 我们可以说猫是猫:猫 cat = new 猫();
- 我们也可以说猫是动物:动物 animal =new 猫();
- 这里猫在不同时刻表现出来的不同形态,这就是多态
- 猫
-
- 多态前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
- 多态前提和体现
-
Dome
package 多态; public class catDome { public static void main(String[] args) { annals c = new cat(); c.eat(); } }
cat
package 多态; public class cat extends annals{ @Override public void eat() { System.out.println("猫吃鱼"); } }
annals
package 多态; public class annals { public void eat(){ System.out.println("吃"); } }
结果
猫吃鱼
多态中成员访问的特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
- annals(左边) cat= new cat(右边)();
为什么成员方法和成员变量的访问不一样呢?
- 因为成员方法有重写,而成员变量没有
Dome
package 多态;
public class catDome {
public static void main(String[] args) {
annals c = new cat();
c.eat();
System.out.println(c.name);
}
}
cat
package 多态;
public class cat extends annals{
public String name = "xiaohuang";
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
annals
package 多态;
public class annals {
public String name = "xiaobai";
public void eat(){
System.out.println("吃");
}
}
结果
猫吃鱼
xiaobai
多态的好处和弊端
-
多态的好处:提高 程序的扩展性
- 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
-
多态的弊端:不能使用子类特有的功能
演示:
package 多态;
public class catDome {
public static void main(String[] args) {
annalsObject an =new annalsObject();
cat c = new cat();
an.user(c);
Dog d = new Dog();
an.user(d);
}
}
Dog类
package 多态;
public class Dog extends annals {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
cat类
package 多态;
public class cat extends annals{
public String name = "xiaohuang";
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
object类
package 多态;
public class annalsObject {
public void user(annals a){
a.eat();
}
}
annals类
package 多态;
public class annals {
public String name = "xiaobai";
public void eat(){
System.out.println("吃");
}
}
多态中的转型
-
向上转型
- 从子到父转型
- 父类引用指向子类对象
-
向下转型
- 从父到子
- 父类引用转为子类对象
Dome:
package 多态;
public class catDome {
public static void main(String[] args) {
// 向上转型
annals a = new cat();
a.eat();
// 向下转型
cat c = (cat)a;
c.name();
c.eat();
}
}
annals类
package 多态;
public class annals {
public String name = "xiaobai";
public void eat(){
System.out.println("吃");
}
}
cat类
package 多态;
public class cat extends annals{
public String name = "xiaohuang";
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void name(){
System.out.println("Tom");
}
}