Java override方法重写(附带实例)
Java 中的重写方法指的是对一个方法进行重新定义,也就是在父子类中,子类定义了一个与父类方法相同名称、相同参数列表、相同返回值类型的方法,唯一的区别是两者的具体实现不同。
方法重写(override)也称为方法覆盖,其实覆盖能更好地表达其中的含义,即子类的方法覆盖父类的方法。
我们通过一个实例来理解方法重写:
然后定义一个 Circle 类,该类继承了 Shape 类,由于圆的面积有自己的计算公式,因此在 Circle 类中重写 calcArea() 方法。
再定义一个 Triangle 类,它同样继承了 Shape 类,三角形的面积公式为底乘以高除以二,所以 Triangle 类也需要重写 calcArea() 方法。
最后定义一个继承了 Shape 类的 Rectangle 类,并且根据矩形的面积计算公式重写 calcArea() 方法。
下面我们可以编写一个主方法来测试方法重写的效果:
根据上面的学习我们明白了如何进行方法重写,总结起来重写需要满足的条件如下:
接着我们来分析静态方法能不能被重写,直接用代码说明:
所以可以得出结论,无法重写静态方法。
方法重写(override)也称为方法覆盖,其实覆盖能更好地表达其中的含义,即子类的方法覆盖父类的方法。
我们通过一个实例来理解方法重写:
class Shape {
float calcArea() {
return 0f;
}
}
class Circle extends Shape {
float radius;
Circle(float radius) {
this.radius = radius;
}
float calcArea() {
return (float) (3.* Math.pow(radius, 2));
}
}
class Triangle extends Shape {
float height;
float width;
Triangle(float height, float width) {
this.height = height;
this.width = width;
}
float calcArea() {
return height * width / 2;
}
}
class Rectangle extends Shape {
float height;
float width;
Square(float height, float width) {
this.height = height;
this.width = width;
}
float calcArea() {
return height * width;
}
}
首先定义一个 Shape 类作为父类,该类内部定义了一个名为 calcArea() 的计算面积的方法。然后定义一个 Circle 类,该类继承了 Shape 类,由于圆的面积有自己的计算公式,因此在 Circle 类中重写 calcArea() 方法。
再定义一个 Triangle 类,它同样继承了 Shape 类,三角形的面积公式为底乘以高除以二,所以 Triangle 类也需要重写 calcArea() 方法。
最后定义一个继承了 Shape 类的 Rectangle 类,并且根据矩形的面积计算公式重写 calcArea() 方法。
下面我们可以编写一个主方法来测试方法重写的效果:
public static void main(String[] args) {
Circle c = new Circle(4);
Triangle t = new Triangle(3, 4);
Rectangle r = new Rectangle(3, 4);
System.out.println(c.calcArea());
System.out.println(t.calcArea());
System.out.println(r.calcArea());
}
程序中分别根据不同形状的公式来计算面积,分别输出“50.24”“6.0”和“12.0”。假如这三个类都不重写 calcArea() 方法,那么它们会调用 Shape 父类的 calcArea() 方法,即输出都为“0.0”。根据上面的学习我们明白了如何进行方法重写,总结起来重写需要满足的条件如下:
- 必须满足父子类的继承关系;
- 子类的方法名必须与父类的相同;
- 子类的方法参数列表必须与父类的相同;
- 子类的方法返回值参数类型必须与父类的相同。
接着我们来分析静态方法能不能被重写,直接用代码说明:
public class OverrideTest2 {
public static void main(String[] args) {
Parent p = new SubClass();
SubClass s = new SubClass();
p.test();
s.test();
}
}
class Parent {
public static void test() {
System.out.println("parent");
}
}
class SubClass extends Parent {
public static void test() {
System.out.println("subClass");
}
}
程序中分别定义父类 Parent 和子类 SubClass,它们都定义了一个静态的 test() 方法,乍一看好像能对静态方法进行重写,但实际运行时就会发现这并不是方法重写。程序输出的结果为“parent”和“subClass”,也就是说并不具备重写后的特性,因为如果重写成功的话输出应该都为“subClass”。所以可以得出结论,无法重写静态方法。
ICP备案:
公安联网备案: