父类在调用方法时 如果子类有重写过的方法 会执行子类重写后的
时间: 2024-09-25 07:07:32 浏览: 34
当你在父类中调用一个已经被子类重写的方法时,Java会动态地依据实际的对象类型来决定执行哪个版本的方法。这种机制叫做方法重写(Override),它实现了多态的一个关键特性。无论你使用的是父类引用还是父类型的实例,只要这个实例是子类的实际对象,那么就会执行子类中定义的重写方法。这使得程序设计更加灵活,可以根据实际情况处理不同的情况。
举个例子:
```java
class Animal {
public void sound() {
System.out.println("Animal makes a generic sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
// 使用父类引用调用
Animal animal = new Dog(); // 创建一个Dog对象并赋值给Animal类型的变量
animal.sound(); // 输出 "Dog barks",尽管我们使用的引用是Animal类型
```
在这个例子中,`sound()` 方法在Dog类中被重写了,所以当我们通过Animal类型的引用调用它时,实际上是执行了Dog类的方法。
相关问题
C#怎么new父类 拿子类接收 调用子类重写父类的方法 怎样才能输出子类的方法
在C#中,你可以通过以下步骤创建一个父类的对象并让它引用子类实例,从而调用子类重写的方法:
1. 首先,你需要声明一个父类,并定义一个虚方法(virtual method),这是一个可以在子类中被重写的方法。例如:
```csharp
public class ParentClass
{
public virtual void BaseMethod() => Console.WriteLine("这是ParentClass的方法");
}
```
2. 然后,创建一个子类并重写这个方法:
```csharp
public class ChildClass : ParentClass
{
public override void BaseMethod() => Console.WriteLine("这是ChildClass重写了的方法");
}
```
3. 当你在程序中需要一个`ParentClass`类型的变量,但实际操作的是子类实例时,可以这样做:
```csharp
ParentClass parentObject = new ChildClass(); // 使用子类的新建实例
// 调用的是子类的方法,因为它是虚方法
parentObject.BaseMethod();
```
当你运行这段代码时,会输出"这是ChildClass重写了的方法"。
Java 父类构造器调用多个子类重写的方法,这些方法都会执行吗,还是自动找到某个子类的方法执行
当 Java 父类构造器调用多个子类重写的方法时,这些方法都不会执行。这是因为在 Java 中,子类的构造器必须在父类构造器执行完毕后才能被调用,因此在父类构造器中调用子类的方法时,子类的构造器还没有被调用,因此子类的方法也不能被执行。如果必须在父类构造器中调用子类的某个方法,可以将该方法定义为 final 类型,这样在子类中重写该方法时,编译器会发出警告。
阅读全文