在
java
中要实现多态,必须要满足如下几个条件,缺一不可:
1.
必须在继承体系下
2.
子类必须要对父类中方法进行重写
3.
通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。
一,重写
(override)
:也称为覆盖。重写是子类对父类非静态、非
private
修饰,非
fifinal
修饰,非构造方法等的实现过程
进行重新编写
,
返回值和形参都不能改变
。
即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定
于自己的行为。 也就是说子类能够根据需要实现父类的方法。
下面代码我们对子类的Dog和Cat分别对父类Animal的sleep函数进行了重写
class Animal{
public void sleep(){
System.out.println("在睡觉");
}
public void eat(){
System.out.println("干饭");
}
}
class Dog extends Animal{
String name = "wangcai";
@Override
public void sleep(){
System.out.println(name + "在睡觉");
}
public void huhu(){
System.out.println(name + "打呼噜");
}
}
class Cat extends Animal{
String name = "xiaomi";
@Override
public void sleep(){
System.out.println( name + "在睡觉");
}
public void huha(){
System.out.println(name + "也打呼噜");
}
}
public class Test {
public static void main(String[] args) {
//向上转型
Animal dog = new Dog();
Animal cat = new Cat();
dog.sleep();
cat.sleep();
System.out.println("======================");
//向下转型
if (dog instanceof Dog){
Dog s1 = (Dog)dog;
s1.huhu();
s1.eat();
}
else if (dog instanceof Cat){
Cat s2 = (Cat)dog;
s2.huha();
}
}
}
结果:
wangcai在睡觉
xiaomi在睡觉
======================
wangcai打呼噜
干饭
二,向上转型:向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
但是当发生向上转移的时候,此时通过父类的引用只能访问父类的方法,不能访问子类特有的成员。例如此时dog不能访问Dog类特有的huhu()方法。
三, 向下转型:
将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。
向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。
Java
中为了提高向下转型的安全性,引入了 instanceof
,如果该表达式为
true
,则可以安全转换。
四,多态的使用:
只需要创造一个新类就能使用方法func来分别调用sleep方法。
public class Test {
public static void func(Animal anm) {
anm.sleep();
}
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
func(dog);
func(cat);
}
}