若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求!
A、重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。)
比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
B、重写规则之二:参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
C、重写规则之三:返回类型必须与被重写方法的返回类型相同。
父类方法A:void eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int eat(){} 子类方法B:long eat(){} 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。
D、重写规则之四:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
import java.io.*;
public class Test {
public static void main (String[] args) {
Animal h = new Horse();
try {
h.eat();
}
catch (Exception e) {
}
}
}
class Animal {
public void eat() throws Exception{
System.out.println ("Animal is eating.");
throw new Exception();
}
}
class Horse extends Animal{
public void eat() throws IOException{
System.out.println ("Horse is eating.");
throw new IOException();
}
}
这个例子中,父类抛出了检查异常Exception,子类抛出的IOException是Exception的子类,也即是比被重写的方法抛出了 更有限的异常,这是可以的。如果反过来,父类抛出IOException,子类抛出更为宽泛的Exception,那么不会通过编译的。
注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。
E、重写规则之五:不能重写被标识为final的方法。
F、重写规则之六:如果一个方法不能被继承,则不能重写它。
比较典型的就是父类的private方法。下例会产生一个有趣的现象。
public class Test {
public static void main (String[] args) {
//Animal h = new Horse();
Horse h = new Horse();
h.eat();
}
}
class Animal {
private void eat(){
System.out.println ("Animal is eating.");
}
}
class Horse extends Animal{
public void eat(){
System.out.println ("Horse is eating.");
}
}
这段代码是能通过编译的。表面上看来违反了第六条规则,但实际上那是一点巧合。Animal类的eat()方法不能被继承,因此Horse类中的 eat()方法是一个全新的方法,不是重写也不是重载,只是一个只属于Horse类的全新的方法!这点让很多人迷惑了,但是也不是那么难以理解。
main()方法如果是这样:
Animal h = new Horse();
//Horse h = new Horse();
h.eat();
编译器会报错,为什么呢?
Horse类的eat()方法是public的啊!应该可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的 方法!
上述原则是以java语言的特性讲的,对于c++语言,原则同样使用。。。
分享到:
相关推荐
Java 中,子类重写父类的方法时,需要注意访问级别的限制。子类的重写方法不能比父类的方法拥有更严格的访问级别。例如,如果父类的方法是包访问权限,子类的重写方法可以是公有访问权限,但不能是私有访问权限。...
Java 限制子类访问的方法分析 Java 限制子类访问的方法分析主要介绍了Java中限制子类访问的方法,结合实例形式分析了java类的继承与访问相关操作技巧与使用注意事项。 首先,需要了解的是private关键字的使用。...
方法重写和方法重载的区别在于,方法重写是指子类对父类方法的重写,而方法重载是指类中多个方法的重载。方法重写是面向对象程序设计语言中多态性的体现,而方法重载是 JAVA 语言中的一种特殊机制。 在 JAVA 中,...
在Java中,一个重要的限制是单一继承,即一个子类只能有一个直接父类,但一个父类可以有多个子类。这与某些其他语言(如C++)的多重继承不同。然而,Java通过接口(Interface)支持多重继承的类似效果,一个类可以...
- 方法覆盖允许子类对父类中已有的非私有(public、protected或包访问)方法进行重新定义,以实现不同的功能或者增强原有功能。 - 关键字`@Override`用于标记一个方法是覆盖了父类的方法,提高代码可读性和编译时...
e) **异常处理**:子类方法抛出的异常类型要么与父类方法相同,要么是父类方法抛出异常的子类。 f) **覆盖发生在继承关系中**:子类通过`extends`关键字继承父类,并在子类中定义相同名称和参数列表的方法来覆盖父类...
6. **方法的覆盖和重载与多态**:覆盖(Overriding)是子类对父类同名方法的重新定义,而重载(Overloading)是同一类中方法名相同但参数列表不同的方法。这两者都是实现多态的方式,但它们的作用和规则有所不同。 ...
- **访问权限的限制**:子类不能降低父类成员的访问级别。例如,如果父类的一个方法被声明为`protected`,那么子类不能将其变为`private`。 - **单一继承**:Java只支持单一继承,也就是说,一个类只能直接继承自一...
例如,如果子类方法重写了父类的方法,我们可以使用`super`调用父类的原始实现。 - 访问父类构造器:在子类的构造器中,可以使用`super()`调用来初始化父类的部分,确保父类的实例化在子类实例化之前完成。 2. **...
2. 如果确实需要在子类中隐藏父类的变量或方法,应该明确地使用合适的访问修饰符(如private、protected)来限制访问,并通过super关键字访问被隐藏的父类成员。 3. 在定义方法时,应注意不要无意中覆盖父类的方法,...
重载在同一类中允许方法名相同但参数列表不同,而重写发生在子类和父类之间,子类可以改变父类方法的行为。向上转型是父类引用指向子类对象,实现了多态,但无法访问子类特有的非重写成员。向下转型则是将父类引用...
4. **覆盖与重载的区别**:覆盖(Overriding)是子类对父类方法的重新定义,它发生在运行时,是多态的核心。重载(Overloading)是同一类中多个同名方法的定义,它发生在编译时,与多态无关。 5. **final关键字与...
这就说明了向上转型后,子类对象虽然可以被视为父类对象,但不能访问父类中不存在的方法,这限制了子类的某些特性。 2. 第二个场景中,我们引入了`BMW`类,它也是`Car`的子类。然后定义了一个`show`方法,接受一个`...
重写是指子类对父类方法的重构,重载是指方法名称相同但是参数列表不同的方法,动态连接是指在编译时不知道具体的方法实现,直到运行时才知道。 要理解多态性,首先要知道什么是“向上转型”。向上转型是指使用父类...
3. **异常限制**:子类重写的方法抛出的异常不能比父类方法抛出的异常更加广泛。 4. **访问级别**:子类重写的方法的访问级别不能低于父类方法的访问级别。 5. **方法体不同**:子类方法的具体实现可以不同于父类。 ...
- 向上转型(父类引用指向子类对象)是多态的基础,而向下转型(子类引用转换回父类引用)是为了访问子类特有的方法,需谨慎处理类型转换异常,可以使用 `instanceof` 关键字进行判断。 5. 代码示例: - 定义了一...
这种机制使得子类可以扩展父类的功能,而无需重新编写父类的代码。在Java中,创建子类的语法如下: ```java class SubClass extends SuperClass { ... } ``` Java的继承有以下几个关键点: 1. Java支持单一继承,...
若子类需要覆盖父类的方法或字段,只需在子类中重新定义即可。 3. 覆盖与访问父类方法 子类可以通过重写方法来覆盖父类的方法,使用`parent::_run()`或者`Computer::_run()`来调用父类被覆盖的方法。这种方式使得...