Java多态性解析:属性与方法的重写与转型

需积分: 0 1 下载量 186 浏览量 更新于2024-08-03 收藏 36KB MD 举报
"韩顺平Java笔记(自用)" 在Java编程中,多态性是面向对象编程的一个核心特性,它允许我们使用一个父类型的引用去引用子类型的实例,从而实现更加灵活的代码设计。本笔记主要探讨了与Java多态相关的几个关键知识点。 首先,我们来理解"属性重写问题"。在Java中,属性(字段)不存在重写这一概念,因为它们是静态绑定的,其值取决于对象的实际类型,也就是运行时类型。这意味着,即使你使用父类的引用指向子类的对象,访问属性时仍然会得到子类中该属性的值。`instanceOf`运算符在这里起到了关键作用,它用于判断一个对象是否属于某个特定类型或其子类型。如果对象是右侧类型或其子类,`instanceOf`将返回`true`,否则返回`false`。 例如: ```java Son son = new Son(); Father father = son; // 向上转型 System.out.println(son instanceof Son); // true System.out.println(father instanceof Father); // true System.out.println(father instanceof Grandfather); // true ``` 在这个例子中,`son`是`Son`类型的实例,当我们把它赋值给`Father`类型的引用`father`时,发生了向上转型。这时,`father`可以调用`Father`类中定义的所有公共成员,但由于它实际上是指向`Son`对象,所以调用的方法会由`Son`类的实现来执行。但是,`father`不能直接调用`Son`类特有的成员,除非进行向下转型。 接着,我们来看"向上转型"。向上转型是指父类类型的引用指向子类的对象,它允许我们编写更通用的代码。在Java中,这样声明是合法的: ```java Father father = new Son(); // 向上转型 ``` 这种情况下,`father`在编译时被视为`Father`类型,但在运行时实际指向的是`Son`类型的实例。因此,编译时能调用`Father`类的所有公有成员,而运行时的行为取决于实际的对象类型,即`Son`类。需要注意的是,方法调用是动态绑定的,看运行类型;而属性访问是静态绑定,看编译类型。 最后,我们讨论"向下转型"。向下转型是将父类引用强制转换为子类类型,以便能够访问子类特有的成员。这需要特别小心,因为如果父类引用并没有指向子类的对象,那么在运行时将会抛出`ClassCastException`异常。正确的向下转型示例如下: ```java Father father = new Son(); Son sonRef = (Son) father; // 向下转型,前提是father确实指向Son类型 ``` 一旦成功向下转型,`sonRef`就可以访问`Son`类中的所有成员,包括私有成员和重写的方法。 总结来说,Java的多态性使得我们能够编写更具弹性和可扩展的代码,通过向上转型和向下转型,我们可以灵活地处理不同类层次之间的关系,同时确保类型安全。正确理解和运用这些概念对于Java开发者来说至关重要。