Java的多态性
多态性是面向对象编程的一个重要特征,是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的涵义。可以理解为一个事务的多种形态。
Java实现多态有三个条件:继承,重写和向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用重写的子类方法。
向上转型:父类引用指向子类对象,只能调用父类中已有的方法,不能直接调用子类的方法(向下转型,强制转换类型,把父类强制转换为子类,为了避免出现类转换异常使用关键字instanceof 判断是对象是否是类的实例)。
对象的多态性只适用于方法,不适用于属性。
虚拟方法调用(多态情况下):子类中重写了与父类同名同参数的方法,在多态情况下,父类的方法为虚拟方法,父类动态调用属于子类的该方法。在编译时无法确定调用对象,在运行时确定调用子类方法(动态绑定)。
代码示例:
package Day3;
/*
Java多态性
1.多态性:可以理解为一个事务的多种形态。
2.对象的多态性:父类的引用指向子类的对象(子类的对象赋给父类的引用)。
3.多态性使用:有了对象的多态性以后,时候编译的时候只能调用父类声明的方法,执行的时候实际执行的是子类重写的方法。
4.多态性的使用前提:1.类的继承关系;2.子类有方法的重写;3.父类引用指向子类对象;
5.对象的多态性只适用于方法,不适用于属性
*/
public class SICCSTest {
public static void main(String[] args) {
//对象的多态性:父类的引用指向子类的对象
Animal an1 = new Dog();
Animal an2 = new Cat();
//调用的方法是子类重写的方法(虚拟方法)
an1.shout();//Dog shout
an2.shout();//Cat shout
//an1.play();//不能调用父类中没有的方法,编译时an1是Animal类型
//对象的多态性只适用于方法,不适用于属性
System.out.println(an1.id);//1001
System.out.println(an2.id);//1001
//向下转型,使用子类特有的方法(存在转换不成功的风险,如子类之间强制转换)
//通过instanceof判断
if(an1 instanceof Dog){
Dog dog = (Dog)an1;
dog.play();//Dog play with kids
}
if(an1 instanceof Cat){
Cat cat = (Cat)an1;
cat.play();//
}
// Dog dog = (Dog)an1;
// Cat cat = (Cat)an2;
// dog.play();//Dog play with kids
// cat.play();//Cat play the ball
SICCSTest test = new SICCSTest();
test.func(new Dog());
test.func(new Cat());
}
//通过多态的使用,可以减少重复代码
public void func(Animal animal){
animal.eat();
animal.shout();
}
}
class Animal{
int id = 1001;
public void eat(){
System.out.println("Animal eat");
}
public void shout(){
System.out.println("Animal shout");
}
}
class Dog extends Animal{
int id = 101;
public void eat(){
System.out.println("Dog eat");
}
public void shout(){
System.out.println("Dog shout");
}
public void play(){
System.out.println("Dog play with kids");
}
}
class Cat extends Animal{
int id =110;
public void eat(){
System.out.println("Cat eat");
}
public void shout(){
System.out.println("Cat shout");
}
public void play(){
System.out.println("Cat play the ball");
}
}