1.需求
- 子类在继承父类后,就获取了父类的所有属性和方法,但有时候父类的方法可能并不适用于子类,换而言之,子类需要对父类的方法进行覆盖,覆写的操作.
2.规则
- 方法声明的格式 : 权限修饰符 返回值类型 方法名(参数列表).
- 父类被重写的方法的方法名和形参列表必须相同.(方法名和形参列表是方法的签名,而权限修饰符和返回值类型并不是)
- 子类重写的方法的权限修饰符不小于父类被重写方法的权限修饰符.(如果父类被重写方法的权限修饰符是public,那么子类重写方法的权限修饰符必须是public).(子类不能重写父类中声明为private的私有方法,因为继承性不能破坏其封装性).
- 如果父类被重写方法的返回值类型是void,那么子类重写父类的方法的返回值类型必须是void.
- 如果父类被重写方法的返回值类型是基本数据类型(如int,double),那么子类重写父类方法的方法名必须是相同的基本数据类型.
- 如果父类被重写方法的返回值类型是引用数据类型(如类),那么子类重写父类方法的返回值类型可以与父类该方法的返回值类型相同,也可以是其返回值类型的子类.
- 只有普通的方法调用可以是多态的。成员变量和静态方法不具有多态性,即不能重写
3.(注意)
- 父类的方法才会被重写,而父类的属性并不会,即并不会被子类的同名属性覆盖.
public class GeometricObjectText { public static void main(String[] args) { GeometricObjectText g = new GeometricObjectText(); Circle c = new Circle(1, "黑色", 1); MyRectangle m = new MyRectangle("绿色", 1, 2, 1); System.out.println(g.equalsArea(c, m)); g.displayGeometricObject(c); g.displayGeometricObject(m); } 输出结果 : false 面积是3.141592653589793 黑色 面积是2.0 绿色 public boolean equalsArea(GeometricObject c, GeometricObject m) { if (c.findArea() == m.findArea()) { return true; } else { return false; } } public void displayGeometricObject(GeometricObject g) { System.out.println("面积是" + g.findArea()); System.out.println(g.getColor()); } } public class GeometricObject { private String color; private double weight; public GeometricObject() { } public GeometricObject(String color, double weight) { this.color = color; this.weight = weight; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public double findArea() { return 1.0; } } public class Circle extends GeometricObject { private double radius; public Circle(double radius, String color, double weight) { super(color, weight); this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } //方法的重写 public double findArea() { return (Math.PI) * radius * radius; } } public class MyRectangle extends GeometricObject { private double width; private double height; public MyRectangle(String color, double weight, double width, double height) { super(color, weight); this.width = width; this.height = height; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } //方法的重写 public double findArea() { return (width) * height; } }