2.
3.
通过子类引用 能调用父类成员变量或方法
但通过父类引用 只能调用自己特有的成员变量或成员方法
调用子类的会报错
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
在生活中,多态就是同一个人对不同的人表现的态度说的话是不一样的
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在继承体系下,向上转型
- 子类和父类有同名的重写方法
- 通过父类的引用调用重写的方法
完成以上三点,就会发生动态绑定,而动态绑定是多态的基础
程序运行时,绑定到了子类的方法,这就叫做动态
子类加了一个与父类一模一样的成员方法,通过父类的引用调用这个方法时,惊奇地发现调用的是子类的方法,这个过程就叫做动态绑定
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(this.name+"正在吃蛋糕");
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}
class Dog extends Animal{
public void bark(){
System.out.println(this.name+"在汪汪叫");
}
public Dog(String name, int age) {
super(name, age);
}
public void eat(){
System.out.println(this.name+"正在吃狗粮");
}
}
public class Test {
public static void func(Animal animal)
{
}
public static void main2(String[] args) {
//向上转型
//让Animal引用指向dog所引用的对象new Dog("圆圆",19);
Dog dog = new Dog("圆圆",19);
func(dog);
}
public static void main(String[] args) {
//向上转型
Animal animal =new Dog("圆圆",16);
animal.eat();
}
}
- 代码上会标有两个符号告诉你这是重写
- 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验.
例如不小心将方法名字拼写错了 (比如写成 aet), 编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写
被重写的方法返回值类型可以不同,但是必须是具有父子关系的,
若干年前的手机,只能打电话,发短信,来电显示只能显示号码,而今天的手机在来电显示的时候,不仅仅可以显示号码,还可以显示头像,地区等。在这个过程当中,我们不应该在原来老的类上进行修改,因为原来的类,可能还在有用户使用,正确做法是:新建一个新手机的类,对来电显示这个方法重写就好了,这样就达到了我们当今的需求了。
今天学了多态,动态绑定的原理是向上转型,子类和父类的同名,也就是重写,还要通过父类引用调用这个方法,那么这个方法一定会是子类的。如果不实现重写,object类是所有类的父类,调用的自然是object的方法。还要区分重写和重载,别混淆。