zoukankan      html  css  js  c++  java
  • 重载和重写的区别

    重载 overloading  一个类中多态性的一种表现

    java方法重载,在类中可以创建多个方法,具有相同的名字,但是具有不同的参数和不同的定义

    重载,方法名一样,参数类型和个数不一样,返回类型可以相同也可以不同

    重写 overriding 父类与子类之间的多态性 

    (1)子类中不能重写父类中的final方法 
    (2)子类中必须重写父类中的abstract方法 

    • 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
    • 子类函数的访问修饰权限不能少于父类的;

    面试题:重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 
    答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

     public class Base
        {
            void test(int i)
            {
                System.out.print(i);
            }
            void test(byte b)
            {
                System.out.print(b);
            }
        }
        public class TestOverriding extends Base
        {
            void test(int i)
            {
                i++;
                System.out.println(i);
            }
              public static void main(String[]agrs)
            {
                Base b=new TestOverriding();
                b.test(0)
                b.test((byte)0)
            }
        }

    动态绑定的内幕:

        1、编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base类的test注释掉,这时再编译就无法通过。

     注意:父类引用不能访问子类新定义的方法

        2、重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个(其间会有隐含类型转化)。

    如果编译器找到多于一个或者没找到,此时编译器就会报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1。

        3、若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪
        个方法。

        4、当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实际类型相匹配的方法版本。

    在例子中,b所指向的实际类型是TestOverriding,所以b.test(0)调用子类的test。

    但是,子类并没有重写test(byte b),所以b.test((byte)0)调用的是父类的test(byte b)。

    如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为int,最终调用的是子类的test(int i)。

  • 相关阅读:
    MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
    MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
    MySql cmd下的学习笔记 —— 有关视图的操作(建立表)
    MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)
    MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
    MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
    MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
    MySql cmd下的学习笔记 —— 有关select的操作(order by,limit)
    剑指Offer--第21题 调整数组顺序使奇数位于偶数前面;
    剑指Offer--和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/L-a-u-r-a/p/8505892.html
Copyright © 2011-2022 走看看