8.1 什么是多态
-
方法多态:
-
重载体现多态
-
重写体现多态
-
-
对象多态
-
对象的编译类型和运行类型可以不一致,编译类型在定义时就确定,不能改变。(左边类型为编译类型)
-
对象的运行类型是可以变化的,可以通过
getClass()
来查看运行类型。 -
编译类型看 = 左边 运行类型看 = 右边。
-
8.2 基础知识点
-
覆写
Override
: 在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,并且返回值也相同,被称为覆写(Override)。 -
覆写注意点:
-
子类方法的参数,方法名称 要和父类的方法参数,方法名称完全一样。
-
子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类(父类
object
子类String
) -
子类方法不能缩小父类方法的访问权限
public > protected > 默认 > private void sayok(){}//父类 public void sayok(){} //子类扩大访问权限可行 //子类可以扩大访问权限不能缩小访问权限 //父类是public 子类只能为public
-
-
方法重写和重载的区别
名称 范围 方法名 形参列表 返回类型 修饰符 重载(overload) 本类中 必须一样 类型 个数 顺序至少有一个不同 无要求 无要求 重写(override) 父子类 必须一样 相同 子类重写的方法,返回类型和父类返回类型一致,或者是其子类型 子类方法不能缩小父类方法范围 属性没有重写!! 方法可以重写 属性不可以
Base是父类 有count属性 Sub是子类 有count属性 Base b=new Sub(); b.count 属性是父类的属性!! 属性的值看编译类型!!!!
-
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。
-
多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。
-
在子类的覆写方法中,如果要调用父类的被覆写的方法,可以通过
super
来调用。@Override public String hello() { // 调用父类的hello()方法: return super.hello() + "!"; }
-
继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为
final
。用final
修饰的方法不能被Override
: 类似于 C++ 中的Const
。protected String name; public final String hello() { return "Hello, " + name; }
-
类中同样可以加final字段用来修饰类不能被重写。类中的属性同样也可以用final字段防止重写。但是可以通过构造函数来初始化类中的属性。
8.3 Java动态绑定机制
-
当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。(现在运行类型的类中找对应的方法,没有对应的方法再利用继承的机制调用父类方法)
-
但调用对象属性时,没有动态绑定机制,那里声明,哪里使用。