您的位置:

Java重写

Java是一门非常强大和流行的编程语言。Java有很多的特性,其中之一是重写(override)。Java重写允许子类去定义继承自父类的方法,这让代码的重用变得更加方便。在本文中,我们将从以下几个方面详细讨论Java重写:

一、重写的概念

在Java中,重写指的是在子类中定义一个和父类同名、参数列表完全相同的方法,并修改方法体内容。当子类对象调用该方法时,子类重写的方法将会被执行,而不是父类的原始方法。

子类重写父类方法时需要注意以下几点:

1. 方法名和参数列表必须和父类方法完全相同。

2. 方法的访问权限不能比父类方法更严格,可以比父类方法更宽松。

3. 方法的返回类型必须与父类方法完全相同或是其子类。

例如:

public class Animal {
    public void move() {
        System.out.println("Animal can move");
    }
}

public class Dog extends Animal {
    public void move() {
        System.out.println("Dog can run and move");
    }
}

在这个例子中,子类Dog重写了父类Animal的方法move()。当我们执行下面的代码时:

Animal animal = new Dog();
animal.move();

输出结果是:

Dog can run and move

我们可以看到,调用的方法是子类Dog中重写的方法而不是父类Animal中的方法。这就是Java重写的一个例子。

二、重写的作用

重写让我们可以在不需要改变原始方法签名的情况下,对父类中的方法进行修改。这使得代码的重用变得更加方便,同时也让我们可以根据子类的需求对父类方法进行更改。

例如,父类中定义了一个用于计算面积的方法:

public class Shape {
    public double getArea() {
        return 0.0;
    }
}

然后我们创建了一个子类Circle,它继承了父类Shape,并且重写了getArea()方法:

public class Circle extends Shape {
    double radius;
    
    public Circle(double r) {
        radius = r;
    }
    
    public double getArea() {
        return 3.14 * radius * radius;
    }
}

我们可以看到,Circle类中的getArea()方法计算了圆形的面积,这个方法覆盖了父类Shape中的getArea()方法。当我们创建一个Circle对象并调用getArea()方法时,将会调用Circle中的重写方法:

Shape s = new Circle(5.0);
double area = s.getArea();

这里s被声明为Shape类型,但是它引用的实际对象是Circle。因此,当调用s.getArea()时,将会调用Circle中的getArea()方法,输出圆形的面积。

三、使用super关键字调用父类方法

在子类重写父类方法的时候,我们可以使用super关键字来调用父类中被重写的方法。一般来说,我们在子类方法中放置对父类方法的调用,以确保父类方法的行为也被执行。

例如:

public class Animal {
    public void move() {
        System.out.println("Animal can move");
    }
}

public class Dog extends Animal {
    public void move() {
        super.move(); // 调用父类方法
        System.out.println("Dog can run and move");
    }
}

在这个例子中,我们使用了super关键字来调用父类中的方法move()。这样子类Dog中的move()方法就包含了父类中已有的功能,再加上 Dog 自身的功能。这就是 Java 重写的另一个例子。

四、重载和重写的区别

重载和重写是两个相似的概念,但是有一些本质上的区别。

重载是指在一个类中定义多个同名的方法,但是这些方法的参数列表必须不同。例如:

public class MyClass {
    public int add(int x, int y) {
        return x + y;
    }
    public int add(int x, int y, int z) {
        return x + y + z;
    }
}

在这个例子中,我们定义了两个名字相同但参数列表不同的add()方法。它们在行为上不同,但是它们都是相互独立的方法。

而重写是指在子类中定义一个和父类同名、参数列表完全相同的方法,并修改方法体内容。这样子类就可以使用自己的行为来覆盖父类的行为。重写和父类中方法名相同的方法具有相同的方法签名,并且是父类的一种扩展,是一种多态的表现形式。

五、总结

在Java中,重写让子类能够定义继承自父类的方法。重写让代码的重用变得更加方便,同时也使得我们可以根据子类的需求来对父类方法进行更改。重写的时候需要注意方法名和参数列表必须和父类相同,访问权限不能比父类更严格,返回类型必须与父类完全相同或是其子类。

重载和重写是两个相似但本质上不同的概念。重载是在一个类中定义多个同名但参数列表不同的方法,而重写是在子类中重写父类方法。

Java的重写机制是Java实现多态性的一种表现形式,它使得代码更加灵活和易于维护。