随笔 - 11  文章 - 0  评论 - 0  阅读 - 113

多态重写重载

多态(Polymorphism)

Java中的多态是面向对象编程的一个重要特性,它允许使用一个接口来表示不同的类型或行为。多态性(Polymorphism)这个词来源于希腊语,意为“多种形态”。在Java中,多态主要通过方法重写(Overriding)和方法重载(Overloading)来实现。

方法重写 (Overriding)

当子类重新定义了父类的方法,这就是方法重写。在运行时,Java虚拟机会根据对象的实际类型来调用相应的方法,而不是根据引用变量的类型。这使得同一个方法调用可以表现出不同的行为,即实现了运行时多态。

方法重载 (Overloading)

方法重载是指在一个类中可以有多个同名的方法,但是这些方法的参数列表必须不同(参数的数量、类型或者顺序不同)。方法重载是在编译时期决定的,属于静态多态的一种形式。

示例代码

父类引用指向子类对象:

Animal myDog = new Dog();:这里 myDog 是一个 Animal 类型的引用,但它实际上指向的是一个 Dog 对象。

Animal myCat = new Cat();:这里 myCat 是一个 Animal 类型的引用,但它实际上指向的是一个 Cat 对象。

调用子类重写的方法:

myDog.sound();:尽管 myDog 是 Animal 类型的引用,但由于它实际上指向的是 Dog 对象,所以调用的是 Dog 类中重写的 sound 方法,输出 Dog barks。

myCat.sound();:同样,尽管 myCat 是 Animal 类型的引用,但由于它实际上指向的是 Cat 对象,所以调用的是 Cat 类中重写的 sound 方法,输出 Cat meows。

访问子类特有的方法:

如果需要访问 Dog 类特有的 wagTail 方法,需要先进行类型转换:((Dog) myDog).wagTail();。

同样,如果需要访问 Cat 类特有的 purr 方法,需要先进行类型转换:((Cat) myCat).purr();。

// 定义一个父类 Animal
class Animal {
    void sound() {
        System.out.println("This animal makes a sound");
    }
}

// 定义一个子类 Dog,继承自 Animal
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks");
    }

    void wagTail() {
        System.out.println("Dog wags its tail");
    }
}

// 定义一个子类 Cat,继承自 Animal
class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Cat meows");
    }

    void purr() {
        System.out.println("Cat purrs");
    }
}

// 主类 Test
public class Test {
    public static void main(String[] args) {
        // 使用父类类型的引用
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // 调用 sound 方法
        myDog.sound();  // 输出: Dog barks
        myCat.sound();  // 输出: Cat meows

        // 如果需要访问子类特有的方法,需要进行类型转换
        if (myDog instanceof Dog) {
            ((Dog) myDog).wagTail();  // 输出: Dog wags its tail
        }

        if (myCat instanceof Cat) {
            ((Cat) myCat).purr();     // 输出: Cat purrs
        }
    }
}

总结

方法重写是对继承的父类方法的重写。

方法重载是对不同参数对应不同的,具有相同名字的方法的调用。

多态能方便更改调用不同的子类重写出的方法。(调用子类特有的方法不能多态化)

posted on   7007x  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示