主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Java 多态

通俗来说,在面向对象编程中,一个在父类或接口中定义的方法 (方法名和参数都完全一样),当被不同子类(对象类型)的对象实例调用时,会执行各自重写的、不同的内部行为,但是要求所有实现都必须返回相同的数据类型。

例如,狗和猫都属于动物,它们都具有 “吃” 这一共同行为,但具体表现方式却有所不同:狗可能会啃骨头,而猫则可能选择吃老鼠。这正是多态性的体现——同一行为在不同对象上被触发时,会产生不同的具体实现与结果


多态的实现条件

✅ 在 Java 中,要实现多态,必须同时满足以下条件,缺一不可:

  • 继承:多态的实现依赖于类的继承关系。子类继承父类,并可以重写父类的方法。
  • 方法重写 (Override):子类必须重写父类中的方法,以提供特定的实现。
  • 父类引用指向子类对象:通过父类的引用变量来调用子类对象的方法,从而实现动态绑定。

✅ 以下是 Java 多态的使用实例:

java
复制
class Website {
    String name;
    String url;

    public Website(String name, String url) {
        this.name = name;
        this.url = url;
    }

    public void websiteType() {
        System.out.println(name + "是网站!");
    }
}

class Kaicz extends Website {
    public Kaicz(String name, String url) {
        super(name, url);
    }

    @Override
    public void websiteType() {
        System.out.println(name + ":教程网站!");
    }
}

class Google extends Website {
    public Google(String name, String url) {
        super(name, url);
    }

    @Override
    public void websiteType() {
        System.out.println(name + ":搜索引擎网站!");
    }
}

// 调用代码
public class Main {
    public static void main(String[] args) {
        // 多态调用:父类引用指向子类对象
        Website kaicz = new Kaicz("Kaicz", "https://www.kaicz.com");
        Website google = new Google("Google", "https://www.google.com");

        // 调用重写的方法,体现多态
        kaicz.websiteType();
        google.websiteType();
    }
}

执行上面程序后,执行结果:

Kaicz:教程网站!
Google:搜索引擎网站!

多态性的类型

✅ 在 Java 中,多态性主要分为两种类型:

  • 编译时多态 (静态多态):通过方法重载 (Overloading) 实现。方法重载允许在同一个类中定义多个同名但参数不同的方法,编译器根据传入参数的类型和数量来决定调用哪个方法。
  • 运行时多态 (动态多态):通过方法重写 (Overriding) 和父类引用指向子类对象实现。运行时多态允许在运行时根据对象的实际类型来决定调用哪个方法。

运行时多态

在 Java 中,运行时多态通常通过方法重写(Method Overriding)机制来实现。

假设在父类及其子类中创建了相同的方法。在这种情况下,将要调用的方法取决于用于调用该方法的对象。例如:

java
复制
abstract class Website {
    public abstract void printUrl();
}

class Kaicz extends Website {
    @Override
    public void printUrl() {
        System.out.println("www.kaicz.com");
    }
}

class Google extends Website {
    @Override
    public void printUrl() {
        System.out.println("www.google.com");
    }
}

class Main {
    public static void main(String[] args) {
        Kaicz k1 = new Kaicz();
        k1.printUrl();

        Google g1 = new Google();
        g1.printUrl();
    }
}

执行上面程序后,执行结果:

www.kaicz.com
www.google.com

要了解方法重写的工作原理,请访问 Java 中的方法重写

在上面的示例中,printUrl() 方法在两个不同的类中有着不同的实现。程序运行时:

  • 表达式k1.printUrl()将调用 Kaicz 类的方法。这是因为k1是 Kaicz 类的对象。
  • 表达式g1.printUrl()将调用 Google 类的方法。这是因为g1是 Google 类的对象。

编译时多态

在Java中,可以通过方法重载和运算符重载来实现编译时多态。

假设在父类及其子类中创建了相同的方法。在这种情况下,将要调用的方法取决于用于调用该方法的对象。例如:

java
复制
class Website {
    public void printUrl() {
        System.out.println("www.google.com");
    }

    public void printUrl(String url) {
        System.out.println(url);
    }
}

class Main {
    public static void main(String[] args) {
        Website web = new Website();
        web.printUrl();
        web.printUrl("www.kaicz.com");
    }
}

执行上面程序后,执行结果:

www.google.com
www.kaicz.com

在上面的示例中,printUrl() 方法在两个不同的方法中有着不同的实现。程序运行时:

  • 表达式web.printUrl()将调用第一个方法。
  • 表达式web.printUrl("www.kaicz.com")将调用第二个方法。


评论区 0
发表评论