什么是多态
多态:即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
为什么使用多态
一个对象的实际类型是确定的,可以指向的引用类型是不确定的
代码中的具体体现
父类的引用指向子类对象
多态的存在条件
- 有继承关系
- 父类的引用指向子类对象
- 子类重写父类方法 注意:有些方法不能被重写
- static修饰的方法,他属于类,不属于实例
- inal修饰的方法
- private私有方法
什么是重写?
重写: 子类的方法与父类的方法头相同,方法体不同
为什么重写?
父类的功能,子类不一定需要,或者不一定满足
重写的条件
需要有继承关系,子类重写父类的方法,参数列表必须相同
重写的注意事项
- 修饰符:范围可以扩大但不能缩小 public>protected>default>private
- 抛出的异常:范围,可以缩小,但不能扩大。
多态的注意事项 - 重写都是方法的重写与属性无关
- 父类和子类需要有联系否则会导致类型转换异常 ClassCastException!
左编译右执行的理解
编译看左(对象能执行那些方法主要看左边的类型)执行看右(方法的具体调用只能与右边类型有关)
public class Animal {
public void eat(){
System.out.println("动物要吃东西");
}
public void sleep(){
System.out.println("动物要睡觉");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void run(){
System.out.println("猫要跑");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void shout(){
System.out.println("狗要叫");
}
}
创建三个类,Dog类和Cat类均继承Animal类
public static void main(String[] args) {
//父类对象指向子类引用
Animal animal1 = new Cat();
Animal animal2 = new Dog();
Object object = new Cat();
Cat cat = new Cat();
Dog dog = new Dog();
//方法的执行与右边有关
animal1.eat();//猫吃鱼 运行看右,执行Cat中的eat方法
animal2.eat();//狗吃骨头 运行看右,执行Dog中的eat方法
// 方法的调用只与左边有关
animal1.sleep();//可以执行 编译看左Animal有sleep方法因此能够执行
// animal1.run();//不能执行 编译看左Animal无run方法因此不能够执行
cat.sleep();
dog.shout();
// dog.run();不能执行
// animal2.shout();不能执行
}
}
注意:编译看左执行看右针对的是类的方法
对于成员变量的访只与引用有关,因为在运行时,对于成员变量的访问系统接受的是引用类型,引用是哪个类的,就访问哪个类的成员。