08 对象的多态
一、方法函数签名
方法的访问权限、返回类型、名字和参数列表称为方法的签名
二、多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
- 重载
- 重写
三、重载 Overload
在一个类中,可以有多个同名的方法,但是要保证参数类型,数目不相同,否则会产生编译错误
注意参数列表一定要不同 => 参数数量、参数类型、参数顺序
-
被重载的方法必须改变参数列表;
-
被重载的方法可以改变返回类型 ,但是无法以返回值类型作为重载函数的区分标准。
class TEST { public void fuck() { } public void fuck(String a) {} public boolean fuck(String a) {///这个方法不是重载,因为 public void fuck 已经出现了该参数列表 String a,由于Java的重载规范第二点,这将无法通过编译 return true; } }
-
被重载的方法可以改变访问修饰符,同上;
class TEST { protected boolean fuck(String a) { return true; } public boolean fuck(String a) { return true; } ///这个方法不是重载,protected boolean fuck 已经出现了该参数列表 String a,由于Java的重载规范第三点,这将无法通过编译 }
-
被重载的方法可以声明新的或更广的检查异常;
-
方法能够在同一个类中或者在一个子类中被重载。
PS:关于什么是无法以返回值判断是否重载:假设有一些重载函数,那没两两一定满足参数列表不同,但是不一定访问修饰符和返回类型相同。
PS:构造函数可以被重载哦,这也是及其方便的特性,让对对象的初始化更加人性化,方便。
四、重写 Override
重写的实质是指;对父类函数方法的重新编写,即子类屏蔽父类方法,展示新的方法。
在子类声明中,一旦出现函数方法名和父类某一函数方法名相同就要进行检测,如果返回值和参数列表有任意一个不同,都不是重写,而是在子类定义了一个该函数签名的方法而已。
-
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
参数列表必须完全与被重写方法的相同。 -
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
-
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
-
父类的成员方法只能被它的子类重写。
-
声明为 final 的方法不能被重写。
-
声明为 static 的方法不能被重写,但是能够被再次声明。
-
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
-
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
-
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
-
构造方法不能被重写。
-
如果不能继承一个方法,则不能重写这个方法。