所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
什么是多态
多态是Java中面向对象的一个重要的特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
多态的使用
多态使用前提:
1)存在继承
2)存在子类重写父类的方法
多态的引用
1)返回父类对象
2)使用父类作为方法的参数
下面举个多态的例子
public class Pet {
public void play(Pet pet){
System.out.println("父类的eat方法");
};
}
public class Dog extends Pet {
@Override
public void play(Pet pet) {
System.out.println("子类的eat方法");
}
}
public class Master {
public void playPet(Pet pet){
pet.play(pet);
}
public static void main(String[] args) {
Master lili = new Master("");
Dog dog = new Dog();
lili.playPet(dog);
}
}
以上的代码输出的结果是:
子类的eat方法
子类与父类之间的转型
向上转型
向上转型的一个具体的表现就是Java中的多态
向上转型就是把子类转换成父类
语法
父类类型 对象名 = new 子类对象()
它的优点是实现多态,从而提高代码的重用,同时他也存在着一个缺点就是子类特有的方法以及属性无法访问。
向下转型
上面存在的缺点我可以使用向下转型的方法来解决。
向下转型就是把父类变成为子类(存在强制转换)
语法:
子类类型 对象名 = (子类)父类对象;
向下转型也存在着缺点,他的缺点是会出现ClassCastExceotion异常
//Pet类是Cat类与Dog的子类
Pet dog = new Dog();
Cat cat = (Cat)cat;
上面的代码会出现ClassCastExceotion异常
instanceof
instanceof可以解决向下转型带来的问题
可以用 instanceof 判断一个类是否实现了某个接口,也可以用它来判断一个实 例对象是否属于一个类。
所以我们可以在向下转型时多加个instanceof 来判断该实例对象是否属于我们需要转变为的一个类。
instanceof的语法:
对象 instanceof 类(或接口)
他的返回类型是一个boolean值。