1. 方法重写
1.1 定义:当父类中的方法不足以满足子类使用的时候,子类可以对这个方法进行 重新编写,这就是所谓的方法重写。
1.2 特点:
-
在子类中进行方法重写
-
方法名相同
-
参数列表相同
-
返回值类型相同或者为其子类
-
访问类型权限修饰符不能严于父类
2. 方法重写与方法重载的比较
比较项 | 位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 |
---|---|---|---|---|---|
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
3. 多态
3.1 定义:同一个父类引用,指向不同的子类实例,执行的操作不一样。操作不一样,体现在子类重写的方法中,所以说方法重写是实现多态的前提。
3.2 多态的前提:
-
有继承 / (可以有实现关系)
-
有方法重写
-
有父类引用指向子类对象
3.5 多态的格式
父类类型 变量名 = new 子类类型();//然后通过 变量名.方法名()调用在子类中重写的方法//多态体现为父类引用变量可以指向子类对象:定义了一个父类类型的引用,指向新建的子类类型的对象,由于子类是继承他的父类的,所以父类类型的引用是可以指向子类类型的对象的
4. 向上转型:父类的引用(继承对象名/变量名)指向子类的实例。
5. 向下转型:子类的引用指向父类的引用,需要强制转换。
*注:这里的类型转换可能出现一个类型转换异常ClassCastException,
解决办法:Java为我们提供了一个关键字instanceof,它可以帮助我们避免出现ClassCastException这样的异常。
instanceof :判断左边的引用,是否是右边的数据类型。
变量名 instanceof 数据类型
//解释
1.如果变量属于该类型或者其子类型,返回true;
2.如果变量不属于该类型或者其子类型,返回false。
pet = new Penguin("QQ",100,98,"公");
pet.printInfo();
//pet.swimming();
//Dog dog2 = (Dog)pet;
//因为上面pet指向的是Penguin类对象,你在向下转型中应该将其转换为 Penguin类对象,不能将其转换为其它子类对象
//为了避免在向下转型过程中,出现类型转换异常,可以使用instanceof运算 符进行类型判断。instanceof运算符的结果是布尔值
if(pet instanceof Dog){
Dog dog2 = (Dog)pet;
dog2.eat();
}else if(pet instanceof Penguin) {
Penguin penguin = (Penguin)pet;
penguin.swimming();
}