在多态中涉及到将子类对象当做父类对象使用的情况,例如下边两行:
Animal dog=new Dog();
Animal cat=new Cat();
将子类对象当做父类对象使用不需要任何显式的声明,但是需要注意的是,有些时候不能通过父类变量去调用子类的某些方法,下面举一个代码示例
interface Animal{
void shout();
}
class Cat implements Animal{
public void shout(){
System.out.println("喵喵,,,,");
}
void sleep(){
System.out.println("猫在睡觉,,,,");
}
}
public class Main {
public static void main(String[] args) {
Cat cat=new Cat();
animalShout(cat);
}
public static void animalShout(Animal an){
an.shout();
an.sleep();
}
}
上边这个程序在创建Cat类的对象cat之后调用了animalShout方法,但是这个方法的参数类型是Animal类型的,这个时候程序就会自动将cat转换为Animal类型的。但是在Animal接口中并没有定义sleep这个方法,这个是在Cat中定义的,这个时候就需要强制转换类型了,具体如下:
public static void animalShout(Animal an){
Cat an1=(Cat) an;//这一句就是用来强制转换的,格式为:新类型 新名称=(新类型) 老名称
an1.shout();
an1.sleep();
}
将最上方的例子中的animalShout方法修改为这样,程序就不会报错,原因是在这个修改后的方法中的第一行就已经通过强制转换修改了对象的类型
但是如果在animalShout方法中传入一个Dog对象,程序一样会报错,原因是Cat是Animal的子类,而Dog并不是。这个时候就需要一个关键字判断一个对象是否为某个类(或者接口)的实例化对象啦,这个关键字就是instanceof
代码举例:
interface Animal{
void shout();
}
class Cat implements Animal{
public void shout(){
System.out.println("喵喵,,,,");
}
void sleep(){
System.out.println("猫在睡觉,,,,");
}
}
class Dog implements Animal{
public void shout(){
System.out.println("汪汪,,,,");
}
void sleep(){
System.out.println("狗在睡觉,,,,");
}
}
public class Main {
public static void main(String[] args) {
Dog cat=new Dog();
animalShout(cat);
}
public static void animalShout(Animal an){
if(an instanceof Cat){
Cat an1=(Cat) an;
an1.shout();
an1.sleep();
}else{
System.out.println("this animal not a cat");
}
}
}
这个样例的运行结果是this animal not a cat 原因是传入到animalShout方法中的对象是Dog类型的并不是Cat类型,