多态
一、多态的定义:
一个对象拥有多种形态,这就是对象的多态性。也就是说多态针对的是对象。多态的前提是接口和继承(C++中实行多继承,不存在接口)。
二、多态在代码中的形式:
父类 对象名 = new 子类();
或者
接口 对象名 = new 实现类();
三、成员方法使用规则:
右边new的是谁,便使用谁的成员方法(编译看左,运行看右)。
四、成员变量使用规则:
①直接通过对象名访问成员变量:
看等号左边是谁,则优先用谁。没有则向上找。
②间接通过成员方法访问成员变量:
看该方法属于谁,则优先用谁,没有则向上找。
五、对象的转型:
①向上转型
(1)其实就是多态的写法,左父右子。向上转型一定是安全的。
(2)对象无法调用子类特有方法。
②向下转型
(1)其实就是还原过程(只能还原为原来类别)。格式为:
子类 对象名 = (子类)父类对象
(2)转型很可能会失败(本来是猫,向上转为动物后,又向下转型为狗)。
(3)如何判断对象本来属于哪个类(子类)。
对象 instanceof 类 ==》 返回一个布尔值。
六、多态的注意事项:
- 只有成员方法才能覆盖重写,成员变量不可以覆盖重写。
- 父类如果要调用子类的方法必须要有同名方法。
- 多态情况下,子父类存在着同名的成员变量时,默认会访问父类的成员变量。
- 多态情况下,子父类存在着同名的非静态函数时,默认是访问子类的成员函数。
- 多态情况下,子父类存在着同名的静态函数时,默认是访问父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
七、代码
Animal类:
package com.lanyue.day08;
public abstract class Animal {
public static String INFO = "动物界";
public abstract void eat();
public abstract void work();
}
Dog类:
package com.lanyue.day08;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void work() {
System.out.println("狗能看家");
}
}
Cat类:
package com.lanyue.day08;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void work() {
System.out.println("猫能抓老鼠");
}
public void catPlay(){
System.out.println("猫喜欢玩");
}
}
运行类:
package com.lanyue.day08;
public class Demo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.work();
Cat cat = new Cat();
cat.eat();
cat.work();
Animal animal = new Cat();
animal.eat();
animal.work();
if(animal instanceof Cat){
((Cat) animal).catPlay();
System.out.println("猫属于" + Animal.INFO);
}
}
}