/*
* 多态存在的三个必要条件
1:继承
2:重写方法
3:父类引用指向子类对象:Parent p = new Child();//虚方法的调用
* &&&编译看左边,执行看右边(适于方法),******#对于属性则是编译运行都看左边的类型***
//意即在继承或多态使用下,关于调用属性,看等号左边对象。而关于调用方法,看等会右边的对象,先调用右边对象中的方法,若无,则调用父类中同名的方法
* 意即在开发工作中,使用父类作为形参,是多态的只要使用场所,
* 即使增加了新的子类,由于多态性,无需建立新的方法,提高了扩展性
*
* */
public class AnimalsTset {
public static void main(String[] args) {
AnimalsTset test1 = new AnimalsTset();
test1.adopt(new Dog());//此处相当于 Animal animal= new Dog();体现多态
test1.adopt(new Cat());//Animal animal= new Dog();
//这里只能使用Animal 中的方法,而不能使用Dog中的属性和方法,
//即若想使用子类有而父类没有的方法时,在多态下进行强制类型转化
//对于Animal animal= new Dog();
//即 Dog d1 = (Dog) animal;
//这样就可以操作的他的地址
//为了避免出现异常 Animal animal= new Cat(); Dog d1=(Dog)animal
//选择使用instanceof判断是不是此类
//格式::a instanceof b 判断对象a是否是类b的实例(返回true or false)
// 或者a instanceof superb 返回是true,因为b是superb的子类
//if(animal instanceof Dog)
// {
// Dog d1 = (Dog) animal;
//}
}
public void adopt(Animal animal){
animal.eat();//此时看不出来animal是啥,不能写成Dog.eat();
animal.jump();
}
}
class Animal {
public void eat() {
System.out.println("动物进食");
}
public void jump() {
System.out.println("动物跳");
}
}
class Dog extends Animal{
public void eat(){
super.eat();//super 使用直接找到父类
//System.out.println("还会狗吃骨头");
}
public void jump() {
System.out.println("狗急跳墙");
}
// public void adopt(Dog dog){
// dog.eat();//减少这部分的代码冗余
// dog.jump();
//}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void jump() {
System.out.println("猫跳~~");
}
}