zoukankan      html  css  js  c++  java
  • 《编程导论(Java)·2.1.3改写(override)》

    《编程导论(Java)·2.1.3改写(override)》,收集override内容.


    方法改写(method overriding)是指对于父类定义的一个实例方法,同意子类提供自己的实现的一种语言特性。子类的实现将改写(override)或代替(replace)父类中的实现。

    改写成功必须“同一时候”满足下列条件。

    • 两者的方法签名全然同样。
    方法签名(signature)指一个方法的名字和形參列表。a method's signature is its name and the number and the type of its arguments.。而重载方法的方法签名必须不同。本质上。签名不同的方法,是两个不同的方法。


    • 返回类型必须同样或是子类。Java 5.0之前。返回类型不同将导致编译错误。Java 5.0之后,改写方法的返回类型能够是(被改写方法的返回类型的)子类。

      covariant return type

    • 方法改写时,訪问权限不能变得更加私有。不要求两者訪问修饰符同样,但假设父类的方法是包私有的,则改写的方法能够用包私有的、protected和public修饰。假设父类的方法是public,则改写的方法仅仅能用public修饰。
    • 改写的方法,不能抛出比父类方法很多其它的检查型异常
    public interface Sup{   
        public void copy();
    }   
    class Sub implements Sup{
        @Override public void copy(){   
            System.out.println("override"); 
            throw new NullPointerException();
        }
    } 
    编译器无论RuntimeException。


    • 父类的方法不是final方法。final方法不可以被改写。
    • 父类的方法不是private或static方法。否则,即使编写了签名全然同样的方法。可是它们与改写机制无关

    父类的private方法。子类不继承。因而对子类而言毫无意义,如同不存在。

    父类的static方法foo(),假设可以继承。子类可以依照改写的要求如訪问权限更公有、返回值类型同样等,编写方法签名同样的静态方法。可是。前面不可以加@Override。

    两者并列存在。方法隐藏:在子类中直接调用foo(),则运行自定义的静态方法。假设没有自定义的foo()——仅仅有一个继承于父类的static方法foo(),在子类中直接调用foo(),显然运行唯一的foo()。

    所以。自定义的静态方法挡住了父类的方法。


    在能够继承的前提下:

    父类的实例方法。子类能够override一个实例方法,可是子类不得定义签名同样的static方法-编译错误。


    父类的静态方法,子类能够编写隐藏性的静态方法,可是子类不得定义签名同样的实例方法-编译错误。

    overriding与overloading

    如同比較男生和女生。改写是执行时机制,而重载是编译时机制。仅仅有读源码时才有比較的价值,刻薄地说,仅仅有考试时才有比較的价值。



  • 相关阅读:
    MYSQL 数据库管理
    maven初学总结
    解决问题的思路
    java泛型综述
    几种不常用的排序算法
    创新思维
    Django从入门到放弃
    KlayGE 4.0中Deferred Rendering的改进(二):拥挤的GBuffer
    用Android NDK r6编译boost 1.47
    glloader移植到了Android
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5349182.html
Copyright © 2011-2022 走看看