重写(Override)
比如,
定义Father类
1:姓名,吃饭方法,吃窝窝头。
2:定义Son类,继承Father
1:Son类中不定义任何成员,子类创建对象,仍然可以调用吃饭的方法。
2:父类的吃饭的方法,Son不愿吃。Son自己定义了吃饭的方法。
1:此时父类中有一个吃饭的方法,子类中有2个吃饭的方法,一模一样,只是方法体不一样。
2:一个类中两个函数一模一样,是不允许的。
1:编译运行,执行了子类的方法。
2:使用父类的方法,在子类方法中,使用super.父类方法名。
- class Father {
- String name;
- void eat() {
- System.out.println("吃窝窝");
- }
- }
- class Son extends Father {
- public void eat() { // 继承可以使得子类增强父类的方法
- System.out.println("来俩小菜");
- System.out.println("来两杯");
- System.out.println("吃香喝辣");
- System.out.println("来一根");
- }
- }
- class Demo8 {
- public static void main(String[] args) {
- Son s = new Son();
- //执行子类的方法
- s.eat();
- }
- }
3,该现象就叫做重写(覆盖 override)
1,在继承 中,子类可以定义和父类相同的名称并且参数列表一致的函数,将这种函数称之为函数的重写
4,前提
1,必须存在有继承关系
5,特点
1,当子类重写了父类的函数,那么子类的对象如果调用该函数,一定调用的是重写过后的函数,可以通过super关键字进行父类的重写函数的调用
2,继承可以使得子类增强父类的方法
6,细节
1,函数名必须相同
2,参数列表必须相同
3,子类重写父类的函数的时候,函数的访问权限必须大于等于父类的函数的访问权限否则会编译报错
4,子类重写父类的函数的时候,返回值类型必须是父类函数的返回值类型或该返回值类型的子类,不能返回比父类更大的数据类型,如子类函数的返回值类型是object
1:定义 A B C类 B extends A
2:Father类中定义A getA();
3:Son 类中重写getA(); 方法,尝试将返回值修改为B,C ,Object
1:B编译通过
2:C 编译失败 ,没有继承关系
3:Object编译失败,比父类的返回值类型更大
- class A {
- }
- class B extends A {
- }
- class C {
- }
- class Father {
- String name;
- void eat() {
- System.out.println("吃窝窝");
- }
- // 定义一个函数,获取A类的对象,
- A getA() {
- return new A();
- }
- }
- class Son extends Father {
- public void eat() { // 继承可以使得子类增强父类的方法
- System.out.println("来两杯");
- System.out.println("来俩小菜");
- super.eat();
- System.out.println("来一根");
- }
- // B类是A类的子类
- B getA() {
- return new B();
- }
- }
- class Demo8 {
- public static void main(String[] args) {
- Son s = new Son();
- s.eat();
- }
- }
7,子类对象查找属性或方法时顺序
1,原则,就近原则
如过子类的对象调用方法,默认先使用this进行查找,如果当前对象没有找到属性或方法,把当前对象中维护的super关键字指向的对象,如果还没有找到变异报错,找到直接调用,
8,重载和重写的不同
1,重载(overload)
1,前提,所有的重载函数都必须在同一个类中
2,特点
函数名相同,参数列表不同,与其他的无关(访问控制符,返回值类型)
3,不同
个数不同、顺序不同、类型不同
2,重写(override)
1,前提,继承
2,特点
函数名必须相同,参数列表必须相同
子类的返回值类型要等于或者小于父类的返回值
原文地址:http://blog.51cto.com/13797478/2140691