子类
在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
是一个基类,Cat
和 Dog
是它的子类。在 main
方法中,我们创建了一个 Cat
对象和一个 Dog
对象,并将它们赋给 Animal
类型的引用变量 animal1
和 animal2
。
当我们调用 animal1.makeSound()
时,尽管 animal1
的编译时类型是 Animal
,但由于它实际引用的是 Cat
对象,因此在运行时会动态地调用 Cat
类中的 makeSound
方法。同样,animal2.makeSound()
会动态地调用 Dog
类中的 makeSound
方法。
这种动态绑定的行为使得代码更加灵活和可扩展。它允许我们以统一的方式处理不同类型的对象,根据对象的实际类型来执行相应的方法逻辑,从而实现多态性的特性。
那么想调用父类的方法该怎么调用呢?
创建父类的对象呗。
还有一个重要的是如果想要向下引用时,必须先向上转型。
同时这种形式叫做虚方法的调用
虚方法调用实际上是在运行时动态决定调用哪个类的方法,而不是在编译时就决定。
在 Java 中,当一个方法被声明为虚方法(使用 virtual
或 abstract
关键字),它可以被子类重写(覆盖)。在运行时,当通过父类引用调用该方法时,实际执行的是子类中重写的方法。
下面是一个示例,演示了虚方法调用的动态绑定:
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
和两个子类 Cat
和 Dog
。在 Animal
类中有一个虚方法 makeSound()
,并在子类中进行了重写。
在 main
方法中,我们创建了一个 Cat
对象和一个 Dog
对象,并将它们分别赋给 Animal
类型的引用 animal1
和 animal2
。然后,我们通过这些引用调用了 makeSound()
方法。
结果为:
猫发出喵喵的声音
狗发出汪汪的声音
以上是个人理解,如有错误,感谢指正!