2018.01.15多态复习之一

Posted 贰零一八

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.01.15多态复习之一相关的知识,希望对你有一定的参考价值。

覆盖:由于父类的某些方法不适用于子类,所以子类需要重写方法,

         以覆盖(override)父类的方法。

重写和重载有什么区别?

        重载是指在同一个类中有多个同名方法,但是参数类型不同,重写是指父类的

        某些方法不适用于子类,而需要子类来重写父类方法,且覆盖父类方法的过程,

        特点是参数和方法与父类重名。

重载:
public class Dog1{
    Dog1(){
        this.bark();
    }
    void bark(){
        System.out.println("no barking!");
        this.bark("famele",3.4);
    }
    void bark(String m,double l){
        System.out.println("a barking dog!");
        this.bark(5,"China");
    }
}

重写:
class Manager extends Employee{
    private double bonus=1500;

    public Manager(String name,int age,double salary,double bonus){
        super(name,age,salry);
        this.bonus=bonus;
    }

    public void setBonus(double bonus){
        this.bonus=bonus;
    }
    public int getBonus(){
        return bouns;
    }

    //覆盖父类方法getMothlyIncome()方法
    @Override
    public double getMothlyIncome(){
        return this.getSalary()+this.bonus;
    }
}
//延续昨天的代码

其中覆盖的要求如下:

1)匹配方法接口的要求

    子类中定义的新方法和父类中定义的方法要返回值类型、名称、参数列表上保持一致,才叫覆盖。

说明:

Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基

类方法返回类型的子类。协变返回类型允许返回更为具体的类型。

 

import java.io.ByteArrayInputStream;
import java.io.InputStream;

class Base
{
    //子类Derive将重写此方法,将返回类型设置为InputStream的子类
   public InputStream getInput()
   {
      return System.in;
   }
}
public  class Derive extends Base
{
    
    @Override
    public ByteArrayInputStream getInput()
    {
        
        return new ByteArrayInputStream(new byte[1024]);
    }
    public static void main(String[] args)
    {
        Derive d=new Derive();
        System.out.println(d.getInput().getClass());
    }
}
/*程序输出:
class java.io.ByteArrayInputStream
*/

 

 

2)可选的Override标注

javaSE5.0后,可用Override标注告诉编译器方法将要覆盖父类中的声明的方法。但Override标注

是可选的,添加它的目的主要让程序在编译时就能发现方法是否符合语法。

注意:

*子类的覆盖方法不能具有更小的可访问范围;

*子类的覆盖方法不能抛出比父类更多的异常;

 

一般都让子类的覆盖方法的声明形式和父类的覆盖方法完全相同(一般让方法体或返回方式内容有所不同),

并添加Override标注。

 

 

当直接通过子类对象来调用这种被覆盖的后的方法时,真实的调用到的是子类自己重新定义的方法,永远不会是

调用到父类中的这个方法。如果在子类中还想调用父类中被覆盖的的方法,则需要用到super来显式调用。

 

/*类方法的隐藏实例*/
public class HideStaticMethodTest{
    public static void main(String[] args) {
        //使用对象变量的调用父子类中的同名的类方法————建议使用类名来调用
        //使用对象变量调用的是对象变量声明的类型(ClassA)中的类方法
        ClassA a2=new ClassB();
        //上面的代码怎么使用的来着?使用规则如何?父类名 引用对象=new 子类名();
        a2.staticMethod();
    }
}

class ClassA{
    public static void staticMethod(){
        System.out.println("ClassA.test方法");
    }
}

class ClassB extends ClassA{
    //声明了一个与父类同名的方法
    public static void staticMethod(){
        System.out.println("ClassB.test方法");
    }
}
/**运行结果:
*ClassA.test方法
*/

//对于运行结果有点不理解?还有类方法指是什么?

 

以上是关于2018.01.15多态复习之一的主要内容,如果未能解决你的问题,请参考以下文章

复习系列之多态

译丨Yarn - Javascript 新一代套件管理

现代软件工程团队项目贝塔阶段_开发日志_2018.01.15-2018.01.19

java中封装,继承,多态,接口学习总结

面试复习之数据库

面试复习之数据库