首页 > 编程笔记 > Java笔记 阅读:205

什么是多态,Java多态的具体实现(非常详细)

多态是继封装、继承之后,面向对象的第三大特性。多态是指同一操作作用于不同的对象可以有不同的表现形式。它允许父类引用指向子类对象,在运行时根据实际对象的类型来决定调用哪个具体的方法。

多态主要通过方法重写和方法重载来实现。方法重写是子类对父类中同名方法的重新实现,而方法重载是在同一个类中定义多个同名但参数不同的方法。多态使程序具有更好的可扩展性和可维护性,提高了代码的灵活性和可复用性。

多态的优点和作用

Java多态具有许多优点和重要作用。它增强了代码的可扩展性,当有新的子类加入时,无须修改现有代码,让新子类遵循多态规则即可。

多态提高了代码的可维护性,使代码结构更加清晰,易于理解和修改。多态还增加了代码的灵活性,同一操作可以根据不同的对象类型产生不同的行为。同时,多态促进了代码的复用,父类的方法可以被子类共享和重写,减少了代码的重复编写,提高了开发效率,使程序更加高效和优雅。

多态的实现方式

类的多态性是指一个类拥有不同的表现形式。需要注意的是,只有具有子类继承或实现的父类才具有多态特征,在程序运行时根据指定的子类表现出不同的状态。

1) 向上转型

【实例 1】多态向上转型,代码如下:
public class Animal {
    // 定义私有的属性:name
    private String name;
    // 无参构造方法
    public Animal() {
        System.out.println("Animal Constructor");
    }
    // 带参构造方法
    public Animal(String name) {
        this.name = name;
    }
    // Getter
    public String getName() {
        return name;
    }
    // Setter
    public void setName(String name) {
        this.name = name;
    }
    // 定义成员方法:eat 方法
    public void eat() {
        System.out.println("Animal 动物吃东西");
    }
}

public class Cat extends Animal {
    // 无参构造方法
    public Cat() {
        super();
        System.out.println("Cat Constructor");
    }
    // 带参构造方法
    public Cat(String name) {
        super(name);
    }
    /**
     * 子类重写了父类的方法
     */
    @Override
    public void eat() {
        System.out.println("Cat 猫吃猫粮");
    }
    // 子类中特有的方法
    public void sleep() {
        System.out.println("猫在睡觉");
    }
}

public class TestCat {
    public static void main(String[] args) {
        // 使用多态的方式创建对象
        Animal animal = new Cat();
        // 调用的子类重写父类的方法
        animal.eat();
    }
}
在上述代码中,Cat 对象具体来说是 Cat 类型,在代码中可以被声明为 Animal 类型(父类类型),这种表现称为向上转型。

向上转型是程序的默认行为,不需要额外做什么。这样可以在不改变原有代码结构的情况下,以更通用的方式使用或替换子类对象。在 Java 编程语言中,Object 类是所有类的父类,可以将任意对象声明为 Object 类,但不建议这么做。

2) 向下转型

多态的向下转型是将父类引用转换为子类引用,这个过程是强制的。

语法结构如下:
子类类型 变量名 = (子类类型) 父类变量名;

【实例 2】实现了继承,现在针对同一案例实现多态向下转型,代码如下:
public class TestCat {
    public static void main(String[] args) {
        // 向下转型
        Animal animal = new Animal();
        Cat cat = (Cat) animal;
    }
}
在上述代码中,向下转型必须建立在向上转型的基础上。只有先将子类向上转型为父类引用,才能进行向下转型的操作。

在进行向下转型前,最好使用运算符 instanceof 进行判断,以确保向下转型的安全性。如果不进行判断而直接进行向下转型,且父类引用实际指向的对象并非目标子类类型,那么在运行时会抛出 ClassCastException 异常。

相关文章