java中的重载、重写和隐藏

重载

什么是方法的重载?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况

方法的重载的要求或特征?
  • 在同一个类中(前提
  • 方法名必须一样;
  • 参数类型和个数不一样(即参数列表不同);
  • 返回值类型可以相同也可以不相同(即返回值不是判断重载的区分标准);
方法的重载的作用?
  • 方法重载是让类以统一的方式处理不同类型数据的一种手段。
  • 重载Overloading是一个类中多态性的一种表现。(即编译时多态
多态性的表现形式

调用(方法名相同的)方法时,通过传递不同的参数列表(给它们的不同参数个数和参数类型)来决定具体使用哪个方法, 这就是重载表现的多态性。


重写

什么是方法的重写?
  • 方法的重写也称之为方法覆盖;
  • 方法覆盖是说子类重新定义了父类的方法。
方法的重写的要求?
  • 存在继承关系时(前提)
  • 方法覆盖必须有相同的方法名,参数列表和返回类型。
  • 覆盖者可能不会限制它所覆盖的方法的访问(即子类的修饰符权限可大于等于父类,但子类函数的访问修饰权限不能小于父类的)。
方法的重写的作用或使用场景
  • 当子类不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
  • 体现为运行时多态(原因:编译时期只检查参数,不检查方法内部过程。只有当代码执行到具体的类别时,才会去调用该类“重写”的方法)
方法的重写易错点(坑)
  1. 子类重写方法的返回类型必须完全与父类被重写方法的返回类型相同,但在java 1.5 版本后;子类重写方法的返回类型可小于或者等于父类被重写方法的返回类型(例如父类被重写方法的返回类型为List,子类重写方法的返回类型可以是ArrayList)。
  2. 子类重写方法的返回类型不满足上述情况时,即不属于重写,也不属于重载;而是编译时错误。
  3. 子类重写方法抛出异常必须小于或等于父类被重写方法抛出异常
  4. 子类重写方法的参数列表必须完全与父类被重写方法的相同(否则可能是重载)
  5. 子类重写方法的访问权限不能比父类被重写方法的访问权限更小(例如父类被重写方法使用public,子类不能声明为protected)
  6. 不能被继承的方法不能被重写(如final修饰的方法和类)
  7. 重写的方法和被重写的方法都不是静态的
    1. 子类不能用 静态方法 重写父类的非静态方法(编绎时错误)
    2. 子类不能用非静态方法 重写 父类的静态方法(编绎时错误)
    3. 子类不能用静态方法 重写 父类的静态方法(编译正确,但这不是重写,而是隐藏)
  8. 构造方法不能被重写(构造方法都是静态的)
  9. 父类修饰符权限不满足重写时,不能重写(例如子类和父类不在同一个包中,且父类方法权限为default时,该方法不能被重写)

编译时类型和运行时类型

Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型

  • 编译时类型:声明该变量时所使用的类型。(例如 String s ; 的编译时类型为String)
  • 运行时类型:运行时表现的类型,由该变量所指向的对象类型决定

当编译时类型和运行时类型不一致,我们称之为多态。

例如
Father father=new Son();
当对象father编译时为Father类型,但运行时为Son类型时
就是多态。

隐藏

什么是隐藏?

父类和子类拥有相同名字的属性或者方法,父类(在第三类,即子父类之外的类中,表现为子父类)的同名的属性或者方法形式上不见了,实际是还是存在的情况(即java编程工具不会提示该方法存在),称之为隐藏。

隐藏的种类
  1. 方法隐藏(只有一种形式,子父类存在相同的静态方法)
  2. 变量隐藏
    1. 子父类只有有一方为静态变量,即可触发隐藏
隐藏的特点
  1. 当触发隐藏的时候,对象运行时调用属性和方法,为编译时类型(即只与声明类型,而不会发生动态绑定),不会产生多态;
  2. 隐藏不受RTTI约束
public class Father {

    public static ArrayList test(){
        return null;
    }
}

public class Son extends Father{

    public static ArrayList test(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        return list;
    }
}

public class Test {

    public static void main(String[] args) {
        Father father=new Son();
        Son son = new Son();
        /**
         * 工具不会提示father对象拥有test方法,
         * 输出结果为null,即运行了父类自身的方法(编译时类型的方法),没有体现多态
         */
        System.out.println(father.test());
        /**
         *  工具不会提示son对象拥有test方法,
         * 输出结果为[1],即运行了子类自身的方法(编译时类型的方法);
         * 证明子类方法可以正常运行。
         */
        System.out.println(son.test());
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值