Java学习笔记(28)--覆写(Override)详解

一、覆写概念

既然现在出现了继承的关系,那么就存在了子类和父类的联系,而在子类之中有可能定义和父类完全相同的方法或属性的名称,这个时候就称为覆写了。

二、方法的覆写

当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。

没有覆写的操作:

package com.wz.overridedemo;

class A {
    public void print() {
        System.out.println("Hello World .");
    }
}

class B extends A {
}

public class Test {
    public static void main(String args[]) {
        B b = new B();
        b.print(); // 方法从父类继承而来
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

运行结果:

Hello World .
 
 
  • 1

这时实例化的是子类对象,但是在子类中没有print()方法,那么就使用从父类中继承而来的pritn()方法。

实现覆写:

package com.wz.overridedemo;

class A {
    public void print() {
        System.out.println("Hello World .");
    }
}

class B extends A {
    public void print() { // 方法名称、参数类型及个数、返回值全相同
        System.out.println("世界,你好!");
    }
}

public class Test {
    public static void main(String args[]) {
        B b = new B();
        b.print(); // 方法从父类继承而来
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:

世界,你好!
 
 
  • 1

当一个类中的方法被覆写后,如果实例化的是这个子类对象,则调用的方法就是被覆写过的方法。

在进行方法覆写的时候有一点需要注意:被子类所覆写的方法不能拥有比父类更严格的访问控制权限。 
如果此时父类之中的方法是default权限,那么子类覆写的时候只能是default或public权限,而如果父类的方法是public,那么子类之中方法的访问权限只能是public。

当一个子类覆写了一个父类方法的时候,子类要想调用父类的被覆写过的方法,要在方法前要加上“super”:

package com.wz.overridedemo;

class A {
    public void print() {
        System.out.println("Hello World .");
    }
}

class B extends A {
    public void print() {
        super.print();
        System.out.println("世界,你好!");
    }
}

public class Test {
    public static void main(String args[]) {
        B b = new B();
        b.print(); // 方法从父类继承而来
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行结果:

Hello World .
世界,你好!
 
 
  • 1
  • 2

一定要记住操作范围: 
(1)this.方法():先从本类查找是否存在指定的方法,如果没有找到,则调用父类操作; 
(2)super.方法():直接由子类调用父类之中的指定方法,不再找子类。

问题来了:请问以下的操作是覆写吗?

package com.wz.overridedemo;

class A {
    private void print() {
        System.out.println("Hello World .");
    }

    public void fun() {
        this.print();
    }
}

class B extends A {
    public void print() { // 不叫覆写
        System.out.println("世界,你好!");
    }
}

public class Test {
    public static void main(String args[]) {
        B b = new B();
        b.fun(); // 方法从父类继承而来
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

运行结果:

Hello World .
 
 
  • 1

首先从覆写的概念上来讲:现在父类的权限是private,而子类是public,的确是扩大了权限,而且方法的参数名称及个数、返回值类型都一样。但这种情况在开发之中是不会出现的,使用了private定义的操作都无法覆写。

三、this和super的区别

1

四、方法重载与覆写的区别

2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值