java怎么用父类创建的对象调用子类里的方法
时间: 2024-12-18 07:29:17 浏览: 19
在Java中,通过父类引用调用子类方法的过程叫做方法的动态绑定(Dynamic Dispatch),也称为晚期绑定或运行时多态。这是通过继承和方法重写(Override)实现的。假设你有一个父类`Animal`,然后有一个子类`Dog`,`Dog`覆盖了`Animal`中的某个方法,如`sound()`。
```java
// 父类 Animal
public class Animal {
public void sound() {
System.out.println("动物发出声音");
}
}
// 子类 Dog 继承 Animal 并重写 sound() 方法
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("狗叫汪汪");
}
}
// 创建父类对象并赋值给子类变量
Animal myAnimal = new Dog(); // 动物实例实际上是个Dog
// 调用 sound() 方法,会执行子类 Dog 的版本
myAnimal.sound(); // 输出 "狗叫汪汪"
```
这里,虽然我们使用的是`Animal`类型的引用`myAnimal`,但实际上调用的是`Dog`的`sound()`方法,这就是运行时多态的效果。
相关问题
java 子类继承父类, 父类调用子类的方法
在Java中,当一个子类继承自一个父类时,如果子类覆盖了(也称为重写了)父类的某个方法,那么即使父类通过引用指向的是子类的对象,它依然可以调用该方法。这是因为在父类中调用的方法实际上是根据实际的对象类型来确定的,这正是多态性的体现。
例如,假设有一个`Animal`父类,其中包含一个`sound()`方法。然后有一个`Dog`子类,重写了`sound()`方法,返回"汪汪"的声音。当我们创建一个`Dog`类型的对象,并将其赋值给`Animal`类型的变量时,如果我们从这个`Animal`变量上调用`sound()`,实际上会执行`Dog`子类的`sound()`方法,输出"汪汪"。
```java
class Animal {
public void sound() {
System.out.println("默认声音");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("汪汪");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 父类引用指向子类对象
myDog.sound(); // 调用的是Dog子类的sound方法
}
}
```
java 子类对象赋值给父类后如何调用子类方法
当一个子类对象赋值给父类引用时,只有父类中存在而子类未重写的方法才能被调用。如果想要调用子类中重写的方法,需要将父类引用强制转换为子类类型。例如,如果有一个子类SubClass,重写了父类ParentClass中的方法foo(),则可以使用如下代码调用这个子类方法:
ParentClass obj = new SubClass();
obj.foo(); // 调用ParentClass中的foo()方法
((SubClass) obj).foo(); // 调用SubClass中重写的foo()方法
阅读全文