zoukankan      html  css  js  c++  java
  • JAVA中继承时方法的重载(overload)与重写/覆写(override)

    JAVA继承时方法的重载(overload)与重写/覆写(override)

    重载-Override

    函数的方法参数个数类型不一致,称为方法的重载。

    从含义上说,只要求参数的个数或参数的类型不一致就说两个函数是重载函数,而至于返回值是否一样,没关系。同时,重载可以发生在同一个类中也可以发生在继承关系中。

    class A
    {
    
    }
    
    class B extends A
    
    {
    
        public void fun(String data1)
    
        {
    
            System.out.println(data1);
    
        }
    
        public String fun(String data1, String data2)
    
        {
    
            System.out.println(data1 + "-->" + data2);
    
            return "";
    
        }
    
    }

    上面的代码说明了在同一个类中的方法重载。此外,如果我们把第一个函数移到A类中,也构成了重载关系。

    class A
    
    {
    
        public void fun(String data1)
    
        {
    
            System.out.println(data1);
    
        }
    
    }
    
    class B extends A
    
    {
    
        public String fun(String data1, String data2)
    
        {
    
            System.out.println(data1 + "-->" + data2);
    
            return "";
    
        }
    
    }

    重写-Override

    重写也被称为覆写。对一个方法的重写必须发生在具有继承关系的两个类中,即子类对父类方法的重写。它要求两个方法的参数个数类型以及返回值类型都必须一致,这样才称为方法重写。

    class A
    
    {
    
        public void fun(String data)
    
        {
    
            System.out.println(data);
    
        }
    
    }
    
    class B extends A
    
    {
    
        public void fun(String data)
    
        {
    
            System.out.println("XXXX" + data);
    
        }
    
    }

    上面代码演示了子类对父类方法的覆写。可以看到两个函数的参数个数和类型以及返回值都是一致的。

    同时子类对父类的方法覆写对权限有要求,子类方法的访问权限必须大于或等于父类方法的访问权限。也就是说如果父类方法的访问权限是default,那么子类必须是default或者public,如果父类方法是public访问权限,那么子类就只能是public访问权限了。然而,实际开发中,绝大多数的方法都是public访问权限,所以覆写方法也是public

    关于访问权限,还有一点需要注意的是,父类方法如果是private,根据JAVA的封装性原则,private是不让其它任何类访问的。那么,此时子类能否对父类的private方法进行覆写呢?

    答案是否定的。

    class A
    
    {
    
        public void test()
    
        {
    
            fun();
    
        }
    
        private void fun()
    
        {
    
            System.out.println("父类的private fun()");
    
        }
    
    }
    
    class B extends A
    
    {
    
        public void fun()
    
        {
    
            System.out.println("子类的public fun()");
    
        }
    
    }
    
    public class Hello
    
    {
    
        public static void main(String[] args) throws Exception
    
        {
    
            B b = new B();
    
            b.test();
    
        }
    
    }

    此时运行结果是调用的父类的private fun()方法。

    所以,此时对重载和覆写做一个总结:

    比较项目

    重载

    覆写/重写

    英文名

    Overload

    Override

    函数签名

    只要求函数的参数个数或类型不一致,对返回值没要求

    函数的参数个数、类型、返回值都必须完全一样。

    发生地方

    同一个类或者具有继承关系的两个类中

    只能发生在继承关系的两个类中

    访问权限

    没有限制

    子类覆写方法的访问权限必须大于或等于父类的方法的访问权限

  • 相关阅读:
    C# 生成 DataMatrix 格式的二维码
    Matlab如何连接Oracle数据库及基本操作
    Matlab调用返回游标的存储过程的分析和处理
    Matlab 调用Oracle数据库
    安装discourse
    设置HttponlyCookie解决mshtml编程无法获取验证码图片流
    C#通过COM组件操作IE浏览器(四):实用代码总结
    C#通过COM组件操作IE浏览器(三):了解IHTMLDocument2
    C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录
    C#通过COM组件操作IE浏览器(一):打开浏览器跳转到指定网站
  • 原文地址:https://www.cnblogs.com/kuillldan/p/5905572.html
Copyright © 2011-2022 走看看