zoukankan      html  css  js  c++  java
  • 【笔记】多态之Override

    Override是子类与父类多态性的表现。

    关于Override需要注意几点地方:

    1.被覆盖方法的访问控制级别可以不一样。 

    但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。

     

    2.方法被定义为private或static或final的则不能被覆盖。 

    3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。 

    4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。 

     

    然后让我们看一个坑爹的例子:

    package learn;
    public class Parent {  
          
        private  int num(int i,int j){  
            return i+j;  
        }  
          
        public static void main(String[] args) {  
            Parent p = new Child();  
            System.out.println(p.num(1, 2));  
        }  
    }  
    class Child extends Parent{  
          
        public int num(int x,int y){  
            return x-y;  
        }  
    } 

    得出的结果是:3

    因为Parent中的num()方法是私有函数,所以Child类中的num()并不是继承Parent中的num()方法。

    而p的的类型是Parent,因此调用p的num()时,使用的是父类的num()方法。

    那如果将p的构造方法替换一下

    Child p = new Child();

    这时得到的结果是:-1

    如果将父类中num()方法的修饰符给修改一下

    package learn;
    public class Parent {  
          
        protected   int num(int i,int j){  //这里
            return i+j;  
        }  
          
        public static void main(String[] args) {  
            Parent p = new Child();  //和这里
            System.out.println(p.num(1, 2));  
        }  
    }  
    class Child extends Parent{  
          
        public int num(int x,int y){  
            return x-y;  
        }  
    } 

    因为父类中num()方法的修饰符变成了protected,这样子类就能覆盖父类中的方法,

    因此在调用时会优先调用子类的方法。

    得到的结果是:-1

     

  • 相关阅读:
    LVM磁盘逻辑卷扩容
    confluence 搭建总结
    GTX1050ti安装tensorflow2.0(gpu)
    sublime text 配置 markdown和预览
    Python 程序打包成 exe 可执行文件
    devc++ 配置openCV
    Ubuntu安装sublime text3
    sublime text 配置Miniconda编译环境
    sublime text 配置devc++ 编译环境
    2013-03-27 problem2 A Famous ICPC Team
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2697861.html
Copyright © 2011-2022 走看看