169 多态
同一个对象在不同时刻表现出来的不同形态。
例如,猫是猫,猫也是动物。
Cat = new Cat();
Animal = new Cat();
【多态的前提和体现】
1.有继承or实现关系——什么叫实现?后面讲
2.有方法重写
3.有父类引用指向子类对象
//项目myDuoTai,包itheima01
//思路:创建3个类——猫类、动物类、测试类
//创建多态的前提——继承、重写、父类引用指向子类对象——然后测试
package itheima01
public class Animal{
public void eat(){
System.out.println("这是eat方法:动物吃东西");
}
}
package itheima01;
public class Cat extends Animal{
//便捷输入:此处直接写方法名,系统可提示相关的可重写的方法,如eat
@override
public void eat{
//super.eat;
System.out.println("这是重写后的cat的eat方法:猫吃鱼");
}
}
package itheima01
public class AnimalDemo{
public static void main(String[]args){
//这就是父类引用指向子类对象
Animal a = new Cat();
}
}
170 多态中的访问特点
知识点
编译看(父类引用指向子类对象的)左边,执行看(父类引用指向子类对象的)右边
思路
3个类:动物类、猫类、测试类
动物类:1个变量、1个方法
猫类:继承动物类,2个变量、1个重写的方法、1个独有的方法
测试类:父类引用指向子类对象,调用父类、子类中的变量、方法
知识点
(成员变量)编译看左边,运行看左边
(成员方法)编译看左边,运行看右边
这里指的是创建对象语句的左边和右边,例如Animal a = new Cat;
编译看左边,指的是左边的类or方法里有的,方可编译成功,否则报错
执行看右边,指的是执行结果以右边为准,例如cat里的eat写屏“猫吃鱼”,animal里的eat写屏“动物吃东西”。Animal a = new Cat;的运行结果是“猫吃鱼”,运行cat类的结果
//project/myDuoTai,package/itheima02E170
package itheima02E170;
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.age);
//(引用weight)报错了,因为编译看左边,左边的animal里没有weight
// System.out.println(a.weight);
a.eat();
//(调用catchmouse)报错了,因为编译看左边,左边的animal里没有catchmouse
// a.catchMouse();
}
}
171 多态的好处和弊端
好处 | 提高了程序的扩展性。定义方法的时候,使用父类作为方法参数,使用方法时将以子类运行 |
弊端 | 不可调用子类独有的方法 |
project/myDuoTai
package/itheima03
4 class/Animal,AnimalDemo,AnimalOperator,Cat
思路
动物类:包含eat方法。
猫类:继承动物类,重写eat方法。
动物操作类:包含useanimal方法,带参,参数为cat
测试类:包含main方法,创建动物操作类对象并调用方法
package itheima03E171;
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
package itheima03E171;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package itheima03E171;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void lookdoor(){//lookdoor是子类dog独有的方法
System.out.println("狗能看门");
}
}
package itheima03E171;
public class Pig extends Animal{
@Override
public void eat() {
System.out.println("猪吃白菜");
}
}
package itheima03E171;
public class AnimalOperator {
//public void useAnimal(Cat c){//Cat c=new Cat
//c.eat();
//}
//public void useAnimal(Dog d){//Dog d=new Dog
//d.eat();
//}
public void useAnimal(Animal a){
//Animal c=new Cat
//Animal d=new Dog
a.eat();
//(调用lookdoor)报错了,因为lookdoor是子类dog类独有的方法
//a.lookdoor();
}
}
package itheima03E171;
public class AnimalDemo {
public static void main(String[] args) {
AnimalOperator ao = new AnimalOperator();
Cat c = new Cat();
ao.useAnimal(c);
Dog d = new Dog();
ao.useAnimal(d);
Pig p=new Pig();
ao.useAnimal(p);
}
}
//useAnimal方法使用animal为参数可一次性解决问题,调用时仍需分别创建对象并调用重写的方法才可以达到调用目的