2020.12.10

2020.12.10

1.多态的使用:父类作为方法参数的情况

Q:顾客到宠物店买宠物,随机挑选宠物,让宠物叫一声决定是否购买。

1.pet类定义sound方法,表示宠物的叫声

public class Pet{

private String name;

public Pet(){

this.name="无名氏";

public void sound(){

2.Dog类重写sound方法,实现狗的叫声

public class Dog extends Pet{

@Override

public void sound(){

System.out.println(“2525252525”);

3.Cat类重写sound方法,实现猫的叫声

public class Cat extends Pet{

@Override

public void sound(){

System.out.println(“miao miao miao”);

4.宠物店卖宠物,让宠物叫一声

public class PetShop{

public static void petSound(Dog dog){

dog.sound();

}

public static void petSound(Cat cat){

cat.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);

if(pets[index]instanceof Dog){

petSound((Dog)pets[index]);

}else if(pets[index] instanceof Cat){

petSound((Cat)pets[index]);

分析:PetShop中为每个子类都定义了petSound方法,表示子类的叫声,如果增加子类会导致添加新的叫声方法,不利于扩展性。

重构:解决方法是定义统一的一个叫声方法,将父类Pet作为方法参数

public class PetShop{

//父类引用作为方法参数时,可以传入该类的任意子类对象,实现多态

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]);

}

}

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

Q:宠物店老板要进货,需要购买猫和狗,在PetShop中定义买狗的方法getDog(),getCat()。代码如下:

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());
​ }
}

分析:父类引用作为方法返回值时,可以返回该类的任意子类对象,实现多态

3.抽象

1.什么是抽象类?

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

public abstract class Pet{

2.抽象方法

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

3.抽象类和抽象方法的规则

(1)抽象类中可以包含普通方法或者抽象方法

(2)抽象类可以定义实例属性或者静态属性

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

(4)抽象类中不一定要包含抽象方法

(5)抽象类不允许实例化。

4.为什么使用抽象类?

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

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

  • 将子类定义为抽象类,但这种处理方法导致子类不能被实例化。
  • 在子类中将抽象方法再定义一遍并且添加方法体,此时子类中就没有抽象方法,子类就不是抽象类,因此可以实例化子类对象。

评论