• java重载(overload)和重写(override)


    1.重载overload

      表示一个类中可以有多个名称相同的方法,但这些方法的参数列表不同。(类型不同,顺序不同)

    class A{
        public void fun(int a,float b){
            
        }
        public void fun(float a, int b) {
            // TODO Auto-generated method stub
        }
        public void fun(int a, int b, int c) {
    
        }
    }

      不可以通过用不同的返回值来实现重载

    class A{
        public void fun(int a,float b){
            
        }
        public int fun(int a,float b){
            return 1;
        }
    }

    2.重写override

    class A{
        public A tt(A a){
            return a;
        }
    }
    // 1.重写的方法返回值类型可以是被重写方法返回值相同的类型(或者子类型),
    public
    class B extends A{ @Override public B tt(A a) { // TODO Auto-generated method stub return new B(); } }
    public class B extends A{
        @Override
        public A tt(A a) {
            // TODO Auto-generated method stub
            return new A();
        }
    }    
    public class B extends A{
        // 出错,参数类型必须与被重写方法原来的类型一致,不然就不是重写了,而算是新增了一个方法,需要去掉注解override
        @Override
        public A tt(B a) {
            // TODO Auto-generated method stub
            return new A();
        }
    }    

    重写override需要满足

      参数类型必须与被重写方法原来的类型一致(不能是其子类),否则算是新增的一个方法

      覆盖方法的返回值必须和被覆盖方法的返回值类型一致,或者是其子类。

      被覆盖的方法不能是private权限,否则也算是新增了一个方法,不能算作覆盖。

      覆盖的方法抛出的异常必须和被覆盖方法抛出异常的类型一致,或者是其子类。

    static静态方法不能被重写,子类若定义一个“同方法名,同参数”的方法,只是相当于新增了一个方法

    class A{
        public static void ss(){
            System.out.println("A static fun");
            
        }
    }
    public class B extends A{
        public static void ss(){
            System.out.println("B static fun");
        }
            public static void main(String[] args) {
    
            A a = new B();
            a.ss();
            System.out.println();
            B b =new B();
            b.ss();
        }
    }    

    输出为:

    A static fun
    
    B static fun

      假设静态方法能被重写,根据上转型对象的规则,a调用ss()时应该是B重写的ss()方法,输出应该是“B static fun”

    final方法 不能被重写,并且子类“同名、同参数”的方法也不能定义

      子类可以定义“同名,不同参数的方法”,相当于新增的方法

    class A{
        public final void ff(int a){
            System.out.println("A final fun");
        }
    }
    public class B extends A{
    //    public final void ff(){  //可以被定义,相当于新增的方法
    //        System.out.println("B final fun");
    //    }
    //    public static void ff(){ //可以被定义,相当于新增的方法
    //        System.out.println("B staticfun");
    //    }
    //    public final void ff(int a,int b){ //可以被定义,相当于新增的方法
    //        System.out.println("B final fun");
    //    }
        
        public final void ff(int a){ //不行,方法名,参数名相同,不能被重写。连被定义作为一个新增的方法也不行
            System.out.println("B final fun");
        }
        
        
        public static void main(String[] args) {
    
            A a = new B();
            a.ff();
            System.out.println();
            B b =new B();
            b.ff();
        }
    }

      子类同名的方法,参数为父类final方法的子类型,也相当于新增了一个方法

    class A{
        public final void ff(A a){
            System.out.println("A final fun");
        }
    }
    public class B extends A{
        
        public final void ff(B b){ // 可以,相当于一个新增的方法,b是A的子类型,但是不是同参数类型。
            System.out.println("B final fun");
        }
        
        
        public static void main(String[] args) {
    
            A a = new B();
            a.ff();
            System.out.println();
            B b =new B();
            b.ff();
        }
    }

    注意:final 与 static区别

    当父类有一个static方法时,在子类中定义一个同名,同参数的方法时,相当于新增了一个方法

    当父类友谊个final方法时,子类中不能定义一个同名,同参数的方法(当参数为父类同名方法参数的子类型的时候,不能当做同参数)

  • 相关阅读:
    .NET开发微信公众号之创建自定义菜单
    FOR XML PATH 可以将查询结果根据行输出成XML格式
    Node入门
    javascript客户端检测技术
    理解OAuth 2.0(转)
    RESTful API 设计指南(转)
    forever让nodejs应用后台执行
    Git使用教程
    NodeJS基础教程
    windows系统下简单nodejs安装及环境配置
  • 原文地址:https://www.cnblogs.com/sunupo/p/13496169.html
Copyright © 2020-2023  润新知