本帖最后由 wAng_Yi 于 2018-8-29 16:49 编辑
[Java] 纯文本查看 复制代码 abstract class Animal {
private int age;
private String 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 Animal(int age, String color) {
this.age = age;
this.color = color;
}
public Animal() {
}
public abstract void eat(String something);
}
class Cat extends Animal {
@Override
public void eat(String something) {
System.out.println("猫吃" + something + "!");
}
public void catchMouse(){
System.out.println("猫在抓老鼠!");
}
}
class Dog extends Animal {
@Override
public void eat(String something) {
System.out.println("狗吃" + something + "!");
}
public void lookHome(){
System.out.println("狗子在看家!");
}
}
class Person {
private String name;
private int age;
public void keepPet(Animal animal,String something){
System.out.print(getName() + "在喂");
animal.eat(something);
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Demo {
public static void main(String[] args) {
Person p1 = new Person("Jack",24);
Cat cat = new Cat();
Dog dog = new Dog();
cat.eat("鱼");
dog.eat("骨头");
cat.catchMouse();
dog.lookHome();
p1.keepPet(cat,"猫粮");
p1.keepPet(dog,"狗粮");
}
}
以上面的例子为例,对Java中的多态进行说明
多态的概念:
同一个事物可以有多种不同的表示形态;
多态在Java中的体现:
父类型引用指向子类实例对象;(接口类型引用指向实现类对象);
比如例子中,Animal animal = new Dog();
多态的前提:多态中的两个类型,必须有继承关系(或者接口实现关系);
多态的好处:使用多态可以提高代码复用性,降低维护成本;提高程序扩展性,降低程序的耦合性;
例如,例子中的Person类的方法:
public void keepPet(Animal animal,String something){
System.out.print(getName() + "在喂");
animal.eat(something);
}
可以调用Dog类和Cat类的对象传参
多态的弊端:
父类型引用不能使用子类独有属性和功能;
多态弊端的解决:
使用强制向下转型,将父类型引用转换为子类型引用;
多态的类型转换:
将子类型引用赋值给父类型引用,是向上转型,因为父类型中的成员子类中都有,所以可以自动转换,叫做自动向上转型;
将父类型引用赋值给子类型引用,是向下转型,因为父类型中不一定具有子类型中的成员,所以需要强制转换,叫做强制向下转型;
强制向下转型容易遇到的问题:
如果将不是该类的对象强制转换为该类型,就会出现一个运行时异常:类型转换异常;
避免类型转换异常的解决办法:
在强制向下转型之前先使用关键字:instanceof 进行判断;
多态中成员的特点:
多态发生在父类型引用和子类对象之间,所以静态成员不参与多态,编译和运行都看父类;
非静态成员,编译期都看父类,运行期,函数看子类;
|