Java中覆盖、继承、重载和多态的详细解说与this和super的用法

来源:互联网 发布:深圳爱玩网络 编辑:程序博客网 时间:2024/05/01 19:23
  1. 继承:
    (1)子类的构造方法一定会调用父类的构造方法。
    (2)任何子类构造方法第一行肯定是this();或者super();两个择一。
    this();调用本类的其它构造方法。(传递相应参数调用相应的方法)
    super();调用父类的构造方法。
    (3)如果子类的构造方法中没有显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法
    —子类创建实例对象的时候是否可以调用父类(抽象类)的构造方法?这里是必须调用的。
    (4)如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错
    (5)构造方法不能继承:子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法
    (6父类构造方法:子类的构造方法必须调用父类的构造方法!

    子类和抽象类:
    (1)父类是抽象类,实例化一个子类,如果子类的构造方法没有显示的用super或者this,则会用默认的this来调用父类的无参的构造方法,而且这
    个是子类的构造方法中首先执行的方法,即首先调用父类的构造方法,接着再调用子类的构造方法。
    (2)如果在子类的实例中调用了父类的方法,而这个方法子类中没有重写,则会去调父类中的那个方法;如果子类重写了则调用的就是子类的方法。
    (3)如果在父类中调用了父类的抽象方法,则默认的会去调用子类中已经实现了这个抽象方法的子类方法。

  2. 覆盖:
    子类覆盖父类前提:
    (1) 同名,同参数列表,同返回类型。
    (2) 子类覆盖后的方法的访问权限只能比父类相同或者更宽广。
    (3) 子类覆盖后的方法抛出的异常不能比父类更宽广。
    (4) is-a:指继承。
    has-a:指类实例具有对另一个实例的引用。
    (5) 对于继承关系:当子类的对象来调用父类中的方法时,则执行的是父类只中原有的方法,
    这和多态不一样,如果子类覆盖掉父类的这个方法时,则调用的是子类的这个方法。
    (6)继承中注意的问题:
    重写(也叫覆盖,也叫重构):重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;
    重写方法不能使用比被重写方法更严格的访问权限。
    重写是类与类之间的关系,两者必须是继承关系。重载是方法与方法之间的关系。

  3. 多态:
    (1) 前提:把子类对象当成父类对象来看。
    (2) 把子类对象当成父类对象来看时:只能调用父类中定义的属性和方法。
    (3) 把子类对象当成父类对象来看时:如果子类覆盖了父类中的方法,则调用的
    是子类覆盖后的这个方法。
    但是如果调用属性时是调用父类的属性而并非子类的,所以尽量不要定义
    父子类同名的属性。

  4. 方法重载

    方法重载是在自己的类内定义几个方法名相同但参数列表不同的过程。与上面讲的方法覆盖不同,方法覆盖是子类覆盖父类的方法,而方法重载是在自身一个类内进行定义的方法,只是定义的这些方法名相同但参数列表不同。

    既然在一个类中出现了相同的方法名,或许就有人问了,那程序在调用这些方法时是怎样进行的。其实,当程序在调用这些方法时,编译器是通过区分它们的参数列表来进行区分的。例如,现在有两个重载的方法,有的方法参数列表有一个参数,而另外一个有两个参数,当程序调用这个方法时,编译器会通过查找你要调用的方法里面的参数个数来确定你要调用哪个方法。所以,如果在重载过程中发现有两个或两个以上方法的参数列表一致,编译器则会报错,因为它不能区分你到底要哪个方法。

    Java中允许对任何方法重载。同时要注意,如果重载的两个方法中两个方法的名字和参数列表一致,但方法返回类型不一样,这种情况也会编译出错,因为这是不能区分重载方法的。
    (5) 把父类强制转换成子类时,则调用的是子类中的方法。

  5. 静态方法不能叫”多态”. 切记!
    静态方法不可被覆盖,如果子类和父类有重名的静态方法,虽然编译通过,但并不能实现多态,所以不能
    叫”覆盖”。例如:Animal a = new Bird(); a.move();如果是”多态”的话应该输出的结果为,子类中的结果,
    但是实际不是,它是调用的是父类中的方法。所以不能叫”覆盖(多态)”。
  6. 覆盖(重写)和重载的区别:
    覆盖:(1) 是父子类之间.
    (2) 父子类同名,相同的参数列表,相同的返回类型。
    (3) 子类访问的权限比父类要高。
    (4) 子类抛出的异常比父类小。
    重载:(1) 多数针对一个类.
    (2) 方法名相同,参数列表不同,与返回类型无关。
    (3) 也可能出现在父子类中。
    (4) 一般会想到构造函数,有无参的构造函数,一个参数的,两个参数的。
1 0
原创粉丝点击