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的思想中,是专门用在继承关系中,抽象类在继承关系中当做父类,让子类继承抽象类。
当子类继承抽象类后,子类也继承了父类中的抽象方法,此时子类有两种处理抽象方法的办法:
- 将子类定义为抽象类,但这种处理方法导致子类不能被实例化。
- 在子类中将抽象方法再定义一遍并且添加方法体,此时子类中就没有抽象方法,子类就不是抽象类,因此可以实例化子类对象。
评论