父类的方法被子类重写了,父类调用这个方法执行 java
时间: 2024-09-25 14:21:12 浏览: 35
当父类的方法被子类重写(也称为方法覆盖或重写),这意味着子类提供了一个与父类同名但可能有不同实现的具体方法。在这种情况下,如果父类引用该方法并直接调用,实际执行的是子类的方法。这种行为体现了多态的一个核心特性——运行时多态。
例如,在Java中:
```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 myAnimal = new Dog(); // 创建Dog对象并赋值给父类类型的引用
myAnimal.sound(); // 这里会输出 "Dog barks",因为实际调用了Dog类的sound方法
```
在这个例子中,虽然`myAnimal`是`Animal`类型的引用,但我们创建的是`Dog`实例,所以`sound()`方法执行的是`Dog`子类的版本。这就是动态绑定,也称作 late binding,使得程序可以在运行时根据对象的实际类型确定调用哪一种方法。
相关问题
父类的静态方法能否被子类重写
在Java中,静态方法是属于类的方法,而不是属于对象的方法,因此它们不会被继承。子类可以定义一个与父类静态方法签名相同的静态方法,但是这个方法并不是重写父类的静态方法,而是隐藏了父类的静态方法。
也就是说,子类可以定义一个与父类静态方法签名相同的静态方法,并且在使用子类类型的引用调用这个方法时,会调用子类中的静态方法,而不是父类中的静态方法。但父类的静态方法并没有被子类重写,父类中的静态方法仍然存在并可以被直接调用。
需要注意的是,静态方法不能被重写,因为重写是基于对象的多态性实现的,而静态方法是属于类的方法,不存在对象的多态性。因此,虽然子类可以定义与父类静态方法签名相同的静态方法,但这并不是一种重写,而是一种隐藏。
如果父类方法不想被子类继承要加什么修饰符,子类的方法不想被父类调用呢?现一个不能被继承的类
如果父类中的方法不想被子类继承,可以使用`private`访问修饰符。这表示该方法只能在本类内部访问,不会暴露给子类。对于子类的方法不想被父类直接调用的情况,通常通过`final`关键字实现,标记为`final`的方法在子类中不能被重写。
至于创建一个不能被继承的类,这个在大多数面向对象的语言中是不可能的,因为类是可以被继承的特性之一。然而,你可以创建一个不可实例化的类(也称为抽象类或者"sealed"类,如C#中的sealed class),它不能有默认构造函数,然后声明所有方法为`abstract`或`private`,使得其他类无法继承它并且不能直接创建对象:
```java
// Java 示例 (假设Java不支持密封类)
public abstract class NonInheritableClass {
private NonInheritableClass() {} // 防止外部实例化
// 抽象方法或私有方法,不允许子类覆盖
private final void protectedMethod() {
// ...
}
}
```
在这个例子中,`NonInheritableClass`是一个抽象类,其所有方法要么是`abstract`(强制子类实现),要么是`private`(禁止子类直接访问)。试图继承这个类会报错,因为它没有默认构造函数。
阅读全文