zoukankan      html  css  js  c++  java
  • 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方法
    */

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

     

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    二分LIS模板
    NYOJ16 矩形嵌套 【DAG上的DP/LIS】
    动态规划题库
    洛谷 P1616 疯狂的采药【裸完全背包】
    洛谷 P1049 装箱问题【正难则反/01背包】
    洛谷 P1048 采药【裸01背包】
    洛谷 P1064 金明的预算方案【有依赖的分组背包】
    洛谷 P1064 金明的预算方案【DP/01背包-方案数】
    洛谷 P1060 开心的金明【DP/01背包】
    51nod 1202 不同子序列个数 [计数DP]
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8290365.html
Copyright © 2011-2022 走看看