多态
同一个引用类型,使用不同的实例而执行不同的操作
一个父类的引用它既可以指向父类对象也可以指向子类对象,他可以根据当前时刻指向的不同,自动调用不同对象的方法
注意事项:通过父类的引用只能访问子类从父类继承过来的方法;
只有在父类的引用本身指向就是一个子类对象时,我们才可以把父类的引用强制转化为子类的引用
Instanceof :对象是否是这个特定类或者是它的子类的一个实例
/*
* 抽象类--动物类
*/
public abstract class Animal {
public String name;
public String sex;
/*
* 有参构造方法
*/
public Animal(String name, String sex) {
this.name = name;
this.sex = sex;
}
// 抽象方法
public abstract void eat();
public abstract void play();
@Override
//重写继承Object类的toString()方法
public String toString() {
return name +" " +sex;
}
}
/*
* 继承抽象父类重写父类的方法
*/
public class Cat extends Animal {
// 有参构造方法,使用super调用父类的有参构造
public Cat(String name, String sex) {
super(name, sex);
}
@Override
public void eat() {
System.out.println(name+"喜欢吃鱼!!!");
}
@Override
public void play() {
System.out.println(name+"喜欢玩线球!!!");
}
}
/*
* 继承抽象父类重写父类的方法
*/
public class Dog extends Animal {
// 有参构造方法,使用super调用父类的有参构造
public Dog(String name, String sex) {
super(name, sex);
}
@Override
public void eat() {
System.out.println(name + "喜欢吃骨头!!!");
}
@Override
public void play() {
System.out.println(name +"喜欢玩皮球");
}
}
public class Shop {
/*
* 参数多态:
* 通过子类到父类的自动转换
* 多态实现:必须继承,子类需重写了父类的方法
*/
public static void sellAnimal(Animal animal){
System.out.println("宠物信息如下:");
System.out.println(animal);
animal.eat();
animal.play();
System.out.println("欢迎购买!!!\n");
}
/*
* 返回值多态:用instanof判断形参animal的指向是不是指向子类
* 然后返回了一个Animal类型
*/
public static Animal buyAnimal(Animal animal){
if(animal instanceof Dog){
System.out.println("Dog");
}else if(animal instanceof Cat){
System.out.println(animal);
System.out.println("Cat");
}
return animal;
}
}
/*
* 测试类
*/
public class T1 {
public static void main(String[] args) {
Dog dog = new Dog("藏獒","公");
Cat cat = new Cat("波斯","母");
// 卖-->实参到形参的自动转换
Shop.sellAnimal(dog);
Shop.sellAnimal(cat);
//买-->实参到形参自动转换,instanceof判断父类引用具体指向
// 返回一个Animal
Dog xg = (Dog) Shop.buyAnimal(dog);
xg.eat();
xg.play();
}
}