一、为什么设计多态:模拟现实、代码简洁(让虚拟机完成了很多比较 判断工作)、代码维护扩展的需要
- 上转型【People people=new Student();】:具有父类或接口类型,但指向子类或具体类的对象,调用具体子类的方法而不调用父类的放法(原因:用于代码扩充,易于维护);
- Equals方法比较的是对象的引用,而不是具体值;
- Java中的多态是针对实例方法的,不是针对成员变量和静态方法的;
- 编译期多态(静态绑定):overload(参数不同,含义不同)、override(父类对象调用时,调用的是父类的方法;子类对象调用时,调用的是子类的方法),隐藏(实例变量)
- 运行期多态(动态绑定):上转型(一个变量指向多种类型的对象,因而调用不同对象的方法),覆盖。
- 覆盖(使失效):子类对象在子类内无论如何也不能调用父类实例方法,上转型也不能,只能通过super或创建父类对象来调用。
- Java在运行时确定对象到底是什么类型(父类还是子类)。
- 上转型对象调用父类的变量和静态方法,而调用子类的实例方法。
-
继承的表现就是多态。
- 采用动态绑定,意味着,虚拟机将调用对象实际类型所限定的方法,
- 上转型对象并不能执行所有子类实例方法,只能执行那些在父类中声明、子类中覆盖的子类方法。
二、总结
- Java规范中,一个方法的特征 仅包括:方法的名字、参数的数目、参数的种类;
不包括:参数名字、返回类型、抛出的异常;
2. Main方法也可以被重载
3. 方法覆盖和方法重载 的
相同点:都要求方法名相同、都可以用于抽象方法和非抽象方法之间
不同点:方法覆盖要求参数名一致,重载则相反
覆盖要求返回类型一致,重载则不做限制
覆盖只能子类覆盖父类,重载用于同一个类的所有方法(包括从父类继承来的)。
覆盖对方法的访问权限和抛出的异常有特殊要求,重载则没有限制
父类的方法只能被子类覆盖一次,而一个方法在所在类中可以被重载多次。
4. 隐藏和覆盖的区别:子类对象转化成父类对象后(上转型),能够访问父类被隐藏的变量和静态方法,但不能访问父类被 覆盖的实例方法。