多态:
1. 概念
多态是同一个行为具有多个不同表现形式或形态的能力。
举例: Cat c=new Cat();
Animal a=new Cat();
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
public class MyTest {
public static void main(String[] args) {
Animal an = new Dog();
an.eat();
an=new Cat();
an.eat();
}
}
class Animal{
public void eat(){
System.out.println("吃饭");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("吃小鱼干");
}
}
class Dog extends Animal{
public void eat() {
System.out.println("狗吃骨头");
}
}
2.多态的前提
- 多态的前提:要有继承,如果没有继承,那多态也无从谈起
- 多态要有方法重写,当然不重写,语法上来说,不报错,但是多态的存在就没有意义
- 父类引用指向子类对象:父 f = new 子();
3.多态成员访问特点
a:成员变量
编译看左边,运行看左边。
b:构造方法
创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
c:成员方法
编译看左边,运行看右边。
d:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
public class MyTest {
public static void main(String[] args) {
// Zi zi = new Zi();
// System.out.println(zi.num);
// zi.fuShow();
//多态的形式访问成员变量的特点
//多态的形式访问成员变量:编译看左边,运行看左边
Fu fu = new Zi();
System.out.println(fu.num);
//多态的形式访问成员方法的特点:编译看左边,运行看右边 (子类重写了父类的方法)
fu.fuShow();
//静态方法:不参与重写
fu.fuShow2();
Fu.fuShow2();
Zi.fuShow2();
}
}
class Fu {
int num = 100;
public void fuShow() {
System.out.println("fu show");
}
public static void fuShow2() {
System.out.println("fu 静态 show");
}
}
class Zi extends Fu {
int num = 200;
public void fuShow() {
System.out.println("zi show");
}
public static void fuShow2() {
System.out.println("zi 静态 show");
}
}
4.多态的好处
a:提高了代码的维护性(继承保证)
b:提高了代码的扩展性(由多态保证)
5.多态的弊端和改进
弊端:不能使用子类特有的功能
解决方法:把父类的引用强制转换为子类的引用。(向下转型)
public class MyTest {
public static void main(String[] args) {
Student student1 = (Student) person;//向下转型
student1.playGame();
}
}
class Person {
public void eat() {
System.out.println("吃饭");
}
}
class Student extends Person {
public void eat() {
System.out.println("学生爱吃米饭");
}
public void playGame() {
System.out.println("学生爱玩游戏");
}
}
今天的学习到这里就结束啦~
I figure life’s a gift,and i don’t intend on wasting it.
我觉得人生是礼物,我不想白白浪费
—《泰坦尼克号》