多态的向上转型调用方法的时候调用的是子类重写的方法还是父类的方法

子类

在Java中,当一个对象调用其方法时,实际执行的方法取决于对象的运行时类型而不是编译时类型。这种行为称为动态绑定(dynamic binding)或后期绑定(late binding)。

class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

class Cat extends Animal {
    public void makeSound() {
        System.out.println("猫发出喵喵声");
    }
}

class Dog extends Animal {
    public void makeSound() {
        System.out.println("狗发出汪汪声");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Cat();
        Animal animal2 = new Dog();

        animal1.makeSound(); // 动态调用Cat类的makeSound方法
        animal2.makeSound(); // 动态调用Dog类的makeSound方法
    }
}

        

在上述代码中,Animal 是一个基类,CatDog 是它的子类。在 main 方法中,我们创建了一个 Cat 对象和一个 Dog 对象,并将它们赋给 Animal 类型的引用变量 animal1animal2

当我们调用 animal1.makeSound() 时,尽管 animal1 的编译时类型是 Animal,但由于它实际引用的是 Cat 对象,因此在运行时会动态地调用 Cat 类中的 makeSound 方法。同样,animal2.makeSound() 会动态地调用 Dog 类中的 makeSound 方法。

这种动态绑定的行为使得代码更加灵活和可扩展。它允许我们以统一的方式处理不同类型的对象,根据对象的实际类型来执行相应的方法逻辑,从而实现多态性的特性。

那么想调用父类的方法该怎么调用呢?

创建父类的对象呗。

还有一个重要的是如果想要向下引用时,必须先向上转型。
 

同时这种形式叫做虚方法的调用

虚方法调用实际上是在运行时动态决定调用哪个类的方法,而不是在编译时就决定。

在 Java 中,当一个方法被声明为虚方法(使用 virtualabstract 关键字),它可以被子类重写(覆盖)。在运行时,当通过父类引用调用该方法时,实际执行的是子类中重写的方法。

下面是一个示例,演示了虚方法调用的动态绑定:

class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("猫发出喵喵的声音");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("狗发出汪汪的声音");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Cat();
        Animal animal2 = new Dog();

        animal1.makeSound();  // 调用的是Cat类中的makeSound方法
        animal2.makeSound();  // 调用的是Dog类中的makeSound方法
    }
}

在上述代码中,我们定义了一个基类 Animal 和两个子类 CatDog。在 Animal 类中有一个虚方法 makeSound(),并在子类中进行了重写。

main 方法中,我们创建了一个 Cat 对象和一个 Dog 对象,并将它们分别赋给 Animal 类型的引用 animal1animal2。然后,我们通过这些引用调用了 makeSound() 方法。

结果为:

猫发出喵喵的声音
狗发出汪汪的声音

以上是个人理解,如有错误,感谢指正!

你可能感兴趣的:(java基础,java,开发语言)