禹娜day22

多态的使用

父类的引用作为方法的参数

package itlaobing;

public class Pet {
    private String name;

    public void sound() {

    }

    public Pet() {
        super();
    }

    public Pet(String name) {
        super();
        this.name = name;
    }

}


package itlaobing;

public class Dog extends Pet {
    private String name;

    public Dog(String name) {
        super();
        this.name = name;
    }

    @Override
    public void sound() {
        System.out.println("旺旺");
    }

}

package itlaobing;

public class Cat extends Pet {
    private String name;

    public Cat(String name) {
        super();
        this.name = name;
    }

    @Override
    public void sound() {

        System.out.println("喵喵");
    }
}

package itlaobing;

import java.util.Random;

public class PetShop {

        //父类引用作为方法参数时,可以传入该类的任意子类对象,实现多态
        public static void petSound(Pet pet) {
            pet.sound();
        }

        public static void main(String[] args) {
            Pet pets[] = new Pet[] {
                new Dog("大黄"),
                new Cat("花花"),
                new Dog("小黄"),
                new Cat("波斯")
            };
            int index = new Random().nextInt(pets.length);
            petSound(pets[index]);
        }
    }

多态的使用:父类作为方法返回值的情况

public class PetShop {

    //父类引用作为方法参数时,可以传入该类的任意子类对象,实现多态
    public static void petSound(Pet pet) {
        pet.sound();
    }
    //父类引用作为方法返回值时,可以返回该类的任意子类对象,实现多态
    public static Pet getPet(String breed) {
        Pet pet = null;
        switch(breed) {
        case "dog":
            pet = new Dog();
            break;
        case "cat":
            pet = new Cat();
            break;
        }
        return pet;
    }

    public static void main(String[] args) {
        Pet pets[] = new Pet[] {
            new Dog("大黄"),
            new Cat("花花"),
            new Dog("小黄"),
            new Cat("波斯")
        };
        int index = new Random().nextInt(pets.length);
        petSound(pets[index]);
        Pet pet = PetShop.getPet("dog");
        System.out.println("新进的货物是"+pet.toString());
    }
}
分析:父类引用作为方法返回值时,可以返回该类的任意子类对象,实现多态

抽象

抽象类

如果类使用abstract关键字修饰,该类就是抽象类。

public abstract class Pet{}

抽象方法

如果方法使用abstract关键字修饰,该方法就是抽象方法。抽象方法不允许有方法体。不能有{}

public abstract class pet{

    public abstract void sound();

}
抽象类和抽象方法的规则

1.抽象类可以包含普通方法或者抽象方法。

2.抽象类中可以定义实例属性或者静态属性。

3.如果一个类中包含了抽象方法,那么这个类就必须是抽象类。

4.抽象类中不一定包含抽象方法。

5.抽象类不允许实例化。(抽象类的抽象方法没有方法体)

使用抽象类的原因

抽象类在OOP的思想中,是专门在继承关系中,抽象类在继承关系中当父类,让子类继承抽象类。

why?抽象类中定义抽象方法,让子类继承抽象方法。父类通过抽象方法让子类遵守父类的规范(父类的抽象方法),遵守规范是子类实现了父类的抽象方法。

子类继承抽象类后,子类也继承了父类中的抽象方法,此时的子类有两种处理抽象方法的办法。

第一是将子类定义成抽象类,但是这种这种处理方法导致子类不能被实例化

第二是子类实现父类的抽象方法,怎么实现呢?就是将子类中抽象方法再定义一遍并且添加方法体。此时子类中就没有抽象方法了,子类也就不是抽象类了,这样子类就可以实例化对象了。

类与类之间存在的三种关系

​ is a 继承 use a 使用 has a 包含

##### 关于main方法的args参数的使用

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1