面向对象基础篇 – 多态
- 在JAVA 中对象是可以“向下”兼容的 也就是说,我可以通过父类声明创建一个子类对象
Father son = new Son();
- 但是不能通过子类声明去创建父类对象
通俗来说:
多态就是将子类的身份提高到了父类的身份,但是并不会改变子类对象本质
多态调用成员变量
- 如果父类有,则调用父类成员变量
- 如果子类父类都有,依旧调用父类成员变量
- 如果父类没有,就算子类有也不能调用
也就是,多态下,子类成员变量都不能使用
多态调用成员函数
- 如果父类有,子类未重写,则调用父类
- 如果子类重写,则调用子类
- 如果父类没有,则不能调用
也就是不能调用子类特有方法
多态的对象类型转换
//当通过多态的方法创建一个对象时
//如:
Father son = new Son();
//此时 son 是不能够再使用自己相较于父类独有方法和属性的
//此时如果要使用,那就要对该对象进行类型转换
- 类型转化只能将子类转换为他自己本省的对象类型
//描述动物这种事物的共性eat
abstract class Animal{
abstract void eat();
}
//描述dog这类事物
class Dog extends Animal{
void eat(){
System.out.println("啃骨头");
}
void lookHome(){
System.out.println("看家");
}
}
//描述小猫
class Cat extends Animal{
void eat(){
System.out.println("吃鱼");
}
void catchMouse(){
System.out.println("抓老鼠");
}
}
/*
Animal dog = new Dog(); 形成多态
Animal cat = new Cat(); 形成多态
此时我要让狗展示出不同于其他动物的o特有属性时
需要强制类型转换
Dog dog1 = (Dog) dog ;//注意狗只能是狗
Cat cat1 = (Cat) dog;//报错,无法转换
- 如何判断,对象的类型
这里我们使用到关键字 instanceof
//依旧是上面的程序
System.out.println(dog instanceof Dog);// true
System.out.println(dog instanceof Cat);// false
//因此在在类型转换时,我们可以首先判断他是不是这个对象类型,再进行转换