final类
当将某个类定义为final时,就表明你不打算继承该类,而且也不允许别人这样做。
?
?
final类禁止继承,所以final类中的所有方法都隐式指定为final的,因为无法覆盖它们。在final类中可以给方法添加final修饰,但这不会增添任何意义
final 与 static
static 修饰变量时,其 具有默认值, 且 可改变, 且其 只能修饰成员变量和成员方法。
?
?
一个 static final域 只占据一段不能改变的存储空间,且只能在声明时进行初始化。因为其是 final 的,因而没有默认值;且又是static的,因此在类没有实例化时,其已被赋值,所以只能在声明时初始化。
多态
多态的作用主要体现在两个方面
多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来,从而实现将改变的事物与未变的事物分离开来;
?
?
消除类型之间的耦合关系(类似的,在Java中,泛型也被用来消除类或方法与所使用的类型之间的耦合关系)
向下转型与运行时类型识别
由于向上转型会丢失具体的类型信息,所以我们可能会想,通过向下转型也应该能够获取类型信息。然而,我们知道向上转型是安全的,因为基类不会具有大于导出类的接口。因此,我们通过基类接口发送的消息都能被接受,但是对于向下转型,我们就无法保证了。
要解决这个问题,必须有某种方法来确保向下转型的正确性,使我们不至于贸然转型到一种错误的类型,进而发出该对象无法接受的消息。在Java中,运行时类型识别(RTTI)机制可以处理这个问题,它保证Java中所有的转型都会得到检查。所以,即使我们只是进行一次普通的加括弧形式的类型转换,再进入运行期时仍会对其进行检查,以便保证它的确是我们希望的哪种类型。如果不是,我们就会得到一个类型转换异常:ClassCastException。
重载、覆盖与隐藏
重载与覆盖
重载:如果在一个类中定义了多个同名的方法,但它们有不同的参数(包含三方面:参数个数、参数类型和参数顺序),则称为方法的重载。其中,不能通过访问权限、返回类型和抛出异常进行重载。
? ?
?
覆盖:子类中定义的某个方法与其父类中某个方法具有相同的方法签名(包含相同的名称和参数列表),则称为方法的覆盖。子类对象使用这个方法时,将调用该方法在子类中的定义,对它而言,父类中该方法的定义被屏蔽了。
实现机制
重载是一种参数多态机制,即通过方法参数的差异实现多态机制。并且,其属于一种 静态绑定机制,在编译时已经知道具体执行哪个方法。
?
?
覆盖是一种动态绑定的多态机制。即,在父类与子类中具有相同签名的方法具有不同的具体实现,至于最终执行哪个方法 根据运行时的实际情况而定。 我们应该注意以下几点:
final 方法不能被覆盖;
子类不能覆盖父类的private方法,否则,只是在子类中定义了一个与父类重名的全新的方法,而不会有任何覆盖效果。 覆盖与隐藏
覆盖:指 运行时系统调用当前对象引用 运行时类型 中定义的方法 ,属于 运行期绑定。
? ?
?
?
隐藏:指运行时系统调用当前对象引用 编译时类型 中定义的方法,即 被声明或者转换为什么类型就调用对应类型中的方法或变量,属于编译期绑定。