一、方法的重写(Override)(方法覆盖)java
(1)介绍:编程
java SE5增长@Override注解,并非关键字,覆写某个方法时,添加此注解。@Override能够防止在不想重载时而意外地进行重载。ide
- 1.父类与之类之间的多态性,对父类的函数进行从新定义。同方法名和同参数;
- 2.子类中的方法与父类中的某一方法具备相同的方法名、返回类型和参数列表,则新方法将覆盖原有的方法,若须要父类中原有的方法,使用super关键字;
- 3.子类函数的访问修饰符不能小于父类的;(父类为public,则子类不能为protected或者private等,只能是public的)
- 4.子类抛出异常小于等于父类方法抛出异常;
- 5.重写Override,运行时,方法重写(子类继承父类并重写方法)以及对象造型(父引用子类型对象),父子类的多态性表现,是动态分派,指令invokevirtual,在运行期间根据常量池中的类方法的符号引用解析到实际的类型上;
(2)两同两小一大原则:函数
两同:方法名相同,参数类型相同this
两小:子类返回类型小于等于父类方法返回类型,对象
子类抛出异常小于等于父类方法抛出异常,继承
一大:子类访问权限大于等于父类方法访问权限。it
- 1)参数列表必须彻底与被重写方法的相同;
- 2)返回类型必须彻底与被重写方法的返回类型相同;(备注:这条信息是标准的重写方法的规则,可是在java 1.5 版本以前返回类型必须同样,1.5(包含)j 版本以后ava放宽了限制,返回类型必须小于或者等于父类方法的返回类型 )。才有了子类返回类型小于等于父类方法返回类型。在java里面这个怎么样都是正确的,请小伙伴谨记。
- 3)访问权限不能比父类中被重写的方法的访问权限更低。例如:若是父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。不然会有如下信息:Cannot reduce the visibility of the inherited method from Base
- 4)父类的成员方法只能被它的子类重写。
- 5)声明为final的方法不能被重写。
- 6)声明为static的方法不能被重写,可是可以被再次声明。(static和final的都不能被重写)
- 7)子类和父类在同一个包中,那么子类能够重写父类全部方法,除了声明为private和final的方法。
- 8)子类和父类不在同一个包中,那么子类只可以重写父类的声明为public和protected的非final方法。
- 9)重写的方法可以抛出任何非强制异常,不管被重写的方法是否抛出异常。可是,重写的方法不能抛出新的强制性异常,或者不能抛出比被重写方法声明的更普遍的强制性异常,反之则能够。
- 10)构造方法不能被重写。(构造方法属于static的)
- 11)若是不能继承一个方法,则不能重写这个方法。
二、方法的重载overload编译
(1)介绍面向对象编程
- 1.方法名同样,但参数类型和个数同样,返回值类型能够相同也能够不一样,没法以返回类型做为重载函数的区分标准;
- 2.方法重载就是在类中建立多个方法,方法名相同,参数列表不一样,调用方法时经过传递给它们的不一样参数个数和参数类型来决定具体使用哪一个方法,体现多态性;
- 3.方法重载是让类以统一的方法处理不一样类型数据(同方法名,不一样参数列表)的一种手段;
- 4.重载overload,编译时,同一个类中,同名方法有不一样参数列表(个数、类型),是一个类中多态性的表现,是静态分派,在编译期,经过静态类型而不是实际类型做为断定依据(静态方法也能够重载);
(2)构造方法的重载
构造方法的重载:只须要看参数便可,若是想在一个构造方法中调用另外一个构造方法,那么可使用this()的方法调用,this()括号中的参数表示目标构造方法的参数,this()必需要做为构造方法的第一跳语句,换句话说,this()以前不能有任何可执行的代码。
三、重写和重载:(多态)
底层实现(静态分派和动态分派)
- 重载overload,编译时,同一个类中,同名方法有不一样参数列表(个数、类型),是一个类中多态性的表现,是静态分派,在编译期,经过静态类型而不是实际类型做为断定依据(静态方法也能够重载);
- 重写override,运行时,方法重写(子类继承父类并重写方法)以及对象造型(父引用子类型对象),父子类的多态性表现,是动态分派,指令invokevirtual,在运行期间根据常量池中的类方法的符号引用解析到实际的类型上;
- 多态性是面向对象编程的一种特性,和方法无关;
- 一样的一个方法可以根据输入数据的不一样,作出不一样的处理,即方法的重载——有不一样的参数列表(静态多态性);
- 当子类继承自父类的相同方法,输入数据同样,但要作出有别于父类的响应时,你就要覆盖父类方法, 即在子类中重写该方法——相同参数,不一样实现(动态多态性);
- 单词:重载overload,重写loverride;
- 形式:重载,方法名相同,参数列表不一样(个数、类型、顺序);重写,方法名、返回值、参数列表都相同;
- 范围:重载,是编译时的静态分派,同一个类中;重写,运行时动态分派,发生在继承的父子类中;
- 权限:重载,没有权限限制;重写,子类的覆写的方法权限不能比父类的访问权限小;