Java如何重写父类方法?Car类setCapacity重写失效求助
问题出在方法重写的签名不匹配上!
你这是踩了Java方法重写的经典小坑——子类的方法签名和父类的对不上,导致JVM根本没把它当成重写的方法,而是当成了一个全新的重载方法。
看细节:
- 父类
Vehicle的setCapacity是带int类型参数的:public void setCapacity(int newCapacity) - 你在
Car类里写的setCapacity却是无参的:public void setCapacity()
这俩根本不是同一个方法!所以当你调用car1.setCapacity(1600)的时候,JVM找不到子类带int参数的setCapacity,就直接跑去调用父类的版本了。
怎么修复?
把Car类里的setCapacity改成和父类完全一致的签名,然后在方法里实现你要的逻辑就行——只输出提示,不修改容量。另外强烈建议加上@Override注解,编译器会帮你检查是不是真的正确重写了父类方法,避免再踩类似的坑。
修复后的完整代码:
class Vehicle { // base class int capacity; String make; Vehicle(int theCapacity, String theMake) { capacity = theCapacity; make = theMake; } void print() { System.out.println("Vehicle Info:"); System.out.println(" capacity = " + capacity + "cc"); System.out.println(" make = " + make); } public void setCapacity(int newCapacity) { capacity = newCapacity; System.out.println("New capacity = " + capacity); } } class Car extends Vehicle { String type, model; Car(int theCapacity, String theMake, String theType, String theModel) { super(theCapacity, theMake); type = theType; model = theModel; } public void print() { super.print(); System.out.println(" type = " + type); System.out.println(" model = " + model); } // 修正:和父类方法签名完全一致,加上@Override注解做校验 @Override public void setCapacity(int newCapacity) { System.out.println("Cannot change capacity of a car"); // 啥也别干,就输出提示,不修改容量 } } class Task3 { public static void main(String[] args) { Car car1 = new Car(1200,"Holden","sedan","Barina"); Vehicle v1 = new Vehicle(1500,"Mazda"); v1.setCapacity(1600); v1.print(); car1.setCapacity(1600); car1.print(); } }
额外小提醒
方法重写的核心要求就是方法签名完全匹配——方法名、参数类型、参数数量都得和父类一模一样。另外访问权限不能比父类更严格(比如父类是public,子类不能改成private),不过你这里已经满足了。
内容的提问来源于stack exchange,提问作者user9839084
相关产品推荐
相关产品推荐

