36-Java Polymorphism

1. Polymorphism

insert image description here
insert image description here

2. Features of polymorphic call members

insert image description here

insert image description here

package a01polymorphismdemo01;

public class test {
    
    
    public static void main(String[] args) {
    
    
        //创建对象(多态方式)
        //Fu fu = new zi()
        Animal a = new Dog();

        //调用成员变量:编译看左边,运行也看左边
        //编译看左边:javac编译代码时,会看左边的父类中有没有这个变量;如果有,编译成功,如果没有编译失败
        //运行也看左边:java运行代码的时候,实际获取的就是左边父类中的成员变量的值
        System.out.println(a.name);//动物

        //调用成员方法:编译看左边,运行看右边
        //编译看左边:javac编译代码时,会看左边的父类中有没有这个方法;如果有编译成功,如果没有编译失败
        //运行看右边:java运行代码的时候,实际运行的是之类中的方法
        a.show(); //Dog ---- show方法

        //理解:
        // Animal a = new Dog();
        //现在用a去调用变量和方法
        //a是Animal 类型的,所以默认都会从Animal这个类去找

        //成员变量:在子类的对象中,会把父类的成员变量也继承下来。父: name,子 :name
        //成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的
    }

}

class Animal{
    
    
    String name = "动物";
    public void show(){
    
    
        System.out.println("Animal ---- show方法");
    }
}class Dog extends Animal{
    
    
    String name = "狗";
    @Override
    public void show(){
    
    
        System.out.println("Dog ---- show方法");
    }
}class Cast extends Animal{
    
    
    String name = "猫";
    @Override
    public void show(){
    
    
        System.out.println("猫 ---- show方法");
    }
}

insert image description here

3. Advantages and disadvantages of polymorphism

insert image description here

package a01polymorphismdemo01;

public class test {
    
    
    public static void main(String[] args) {
    
    
        //创建对象(多态方式)
        //Fu fu = new zi()
        Animal a = new Dog();

        //调用成员变量:编译看左边,运行也看左边
        //编译看左边:javac编译代码时,会看左边的父类中有没有这个变量;如果有,编译成功,如果没有编译失败
        //运行也看左边:java运行代码的时候,实际获取的就是左边父类中的成员变量的值
        System.out.println(a.name);//动物

        //调用成员方法:编译看左边,运行看右边
        //编译看左边:javac编译代码时,会看左边的父类中有没有这个方法;如果有编译成功,如果没有编译失败
        //运行看右边:java运行代码的时候,实际运行的是之类中的方法
        a.show(); //Dog ---- show方法

        //不能调用子类的特有功能
        //报错原因?
        //当调用成员方法的时候,编译看左边,运行看右边
        //那么在编译的时候会先检查左边父类中有没有这个方法,如果没有直接报错
        //a.lookHome();

        //解决方法:
        //变回子类的类型就可以
        //细节:转换的时候不能瞎转换,如果转换成其他类型,就会报错
        // Cat c = (Cat) a;
        //c.catchMouse();

        if(a instanceof Dog){
    
    
            Dog d = (Dog) a;
            d.lookHome();
        }else if (a instanceof Cat){
    
    
            Cat c = (Cat) a;
            c.catchMouse();
        }else {
    
    
            System.out.println("没有这个类型");
        }

        //新特性
        //先判断a是否为Dog类型,如果是,则强制转成Dog,并且转换之后的变量名为d
        //如果不是,则不强转,结果直接是false
        if(a instanceof Dog d){
    
    
            //Dog d = (Dog) a;
            d.lookHome();
        }else if (a instanceof Cat c){
    
    
            //Cat c = (Cat) a;
            c.catchMouse();
        }else {
    
    
            System.out.println("没有这个类型");
        }
    }

}

class Animal{
    
    
    String name = "动物";
    public void show(){
    
    
        System.out.println("Animal ---- show方法");
    }
}class Dog extends Animal{
    
    
    String name = "狗";
    @Override
    public void show(){
    
    
        System.out.println("Dog ---- show方法");
    }
    public void lookHome(){
    
    
        System.out.println("狗在看家");
    }
}class Cat extends Animal{
    
    
    String name = "猫";
    @Override
    public void show(){
    
    
        System.out.println("猫 ---- show方法");
    }
    public void catchMouse(){
    
    
        System.out.println("猫在抓老鼠");
    }
}

4. Polymorphism exercise

insert image description here

package a02polymorphismodemo02;

public class Animal {
    
    
    /*1.属性:
    年龄,颜色
    2.行为:
    eat(String something)(something 表示吃的东西)
    * */


    private int age;
    private String color;

    public Animal() {
    
    
    }

    public Animal(int age, String color) {
    
    
        this.age = age;
        this.color = color;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getColor() {
    
    
        return color;
    }

    public void setColor(String color) {
    
    
        this.color = color;
    }

    public void eat(String something){
    
    
        System.out.println("动物在吃"+ something);
    }

}

package a02polymorphismodemo02;

public class Dog extends Animal{
    
    
   //空参构造
    public Dog() {
    
    
    }
    //带全部参数的构造
    public Dog(int age, String color) {
    
    
        super(age, color);
    }

    @Override
    public void eat(String something) {
    
    
        System.out.println(getAge()+"岁的"+getColor()+"颜色的狗两只前腿死死的抱住"+something+"猛吃");
    }

    public void lookHome(){
    
    
        System.out.println("狗在看家");
    }
}

package a02polymorphismodemo02;

public class Cat extends Animal{
    
    
    public Cat() {
    
    
    }

    public Cat(int age, String color) {
    
    
        super(age, color);
    }

    @Override
    public void eat(String something) {
    
    
        System.out.println(getAge()+"岁的"+getColor()+"颜色的猫眯着眼侧着头吃"+something);
    }

    public void catchMouse(){
    
    
        System.out.println("猫抓老鼠");
    }
}

package a02polymorphismodemo02;

public class Person {
    
    
    private int age;
    private String name;

    public Person() {
    
    
    }

    public Person(int age, String name) {
    
    
        this.age = age;
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    /*    public void keepPet(Dog dog,String something){
            System.out.println("年龄为"+age+"岁的" +name+"养了一只"+dog.getColor()+"颜色的"+dog.getAge()+"岁的狗");
            dog.eat(something);
        }

        public void keepPet(Cat cat,String something){
            System.out.println("年龄为"+age+"岁的" +name+"养了一只"+cat.getColor()+"颜色的"+cat.getAge()+"岁的猫");
            cat.eat(something);
        }*/
    //想要一个方法能接收所有的动物,包括狗,猫
    //方法的形参:写成这些类的父类 (多态的应用)
    public void keepPet(Animal animal, String something) {
    
    

        if (animal instanceof Dog dog) {
    
    
            System.out.println("年龄为" + age + "岁的" + name + "养了一只" + dog.getColor() + "颜色的" + dog.getAge() + "岁的狗");
            animal.eat(something);
        }else if(animal instanceof Cat cat){
    
    
        System.out.println("年龄为" + age + "岁的" + name + "养了一只" + cat.getColor() + "颜色的" + cat.getAge() + "岁的猫");
        animal.eat(something);
       }else {
    
    
            System.out.println("没有这种动物");
        }
    }
}

package a02polymorphismodemo02;

public class test {
    
    
    public static void main(String[] args) {
    
    
/*        Person p1 = new Person(30,"老王");
        Dog dog = new Dog(2,"黑色");
        p1.keepPet(dog,"骨头");

        Person p2 = new Person(32,"老李");
        Cat cat = new Cat(3,"灰色");
        p2.keepPet(cat,"鱼");*/

        Person p = new Person(30,"老王");
        Dog dog = new Dog(2,"黑色");
        Cat cat = new Cat(3,"灰色");
        p.keepPet(dog,"骨头");
        p.keepPet(cat,"鱼");
    }
}

insert image description here

Guess you like

Origin blog.csdn.net/u014217137/article/details/129778296