通俗理解向上转型:
就是子类转型成父类。
class A
{
}
class B extends A
{
}
A b = new B();
这个就是向上转型。
向上转型可以像下面这条语句这么简单:
Shape s =new Circle();
这里,创建一个Circle对象,并把得到的引用立即赋值给S矇,这样做看似错误(将一种类型赋值给别一种类型);但实际上没有问题,因为通过继承,Circle就是一种Shape。因此,编译器认可这条语句,也就不会产生错误信息。
假设你调用一个基类方法(它已经在导出类中被覆盖);
s.draw();
你可能再次认为调用的是Shape的draw();因为这毕竟是一个Shape引用,那么编译器是怎样知道去做其它的事情呢?由于后期绑定(多态),还是正确调用了Circle.draw()方法。
总结
1、通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类
a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法
分析:
* 为什么子类的类型的对象实例可以覆给超类引用?
自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;
* a.play()将执行子类还是父类定义的方法?
子类的。在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。
在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。
2、不能把父类对象引用赋给子类对象引用变量
BaseClass a2=new BaseClass();
DerivedC c1=a2;//出错
在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。
c1=(DerivedC)a2; 进行强制转化,也就是向下转型.
3、记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。
你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。
其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错。
例如,DerivedC类在继承BaseClass中定义的函数外,还增加了几个函数(例如 myFun())
分析:
当你使用父类引用指向子类的时候,其实jvm已经使用了编译器产生的类型信息调整转换了。
这里你可以这样理解,相当于把不是父类中含有的函数从虚拟函数表中设置为不可见的。注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的方法体的地址了。
分享到:
相关推荐
Java 向上转型与向下转型 Java 转型是 Java 编程中的一种非常重要的概念,主要包括向上转型和向下转型两种。向上转型是指将子类对象转换为父类对象,而向下转型是指将父类对象转换为子类对象。 向上转型...
java向上转型.doc
"Java 向上转型和向下转型的详解" Java 向上转型和向下转型是面向对象编程语言中的一个重要概念,它们都是继承机制的基础上进行转型的。向上转型是将子类对象转换为父类类型的过程,而向下转型是将父类对象转换...
在Java编程语言中,向上转型和向下转型是对象多态性的关键组成部分,它们涉及到对象的类型转换,使得程序设计更加灵活且易于维护。下面将详细解释这两种转型的概念、原理及应用。 ### 向上转型 向上转型指的是将一...
"Java向上转型和向下转型实例解析" 在Java中,向上转型和向下转型是两个非常重要的概念,它们都是基于继承机制的。向上转型是指子类对象转换为父类或接口,而向下转型是指父类对象转换为子类。了解向上转型和向下...
Java中的“向上转型”是指将子类对象转换为父类类型的过程。在Java中,这是一种自动转换,无需显式操作。这种转换允许我们用父类的引用去引用子类的对象,从而实现对子类功能的调用,同时保持代码的抽象性和通用性。...
理解并熟练运用Java中的向上转型和向下转型是掌握面向对象编程的关键。向上转型简化了代码,提高了代码的通用性,而向下转型则提供了访问子类特定功能的能力。在实际开发中,需谨慎使用向下转型,并确保在转型前进行...
Java 多态向上转型相关原理 多态是面向对象的第三大特征,它有三个优点:改善代码的组织结构和可读性、能够创建可扩展的程序、消除类型之间的耦合关系。多态的概念主要体现在向上转型中,Java 允许把子类对象赋值给...
在主类中people类的声明对象分别作为Chinapeople和Americanpeople类对象的上转型对象,并让这个上转型对象调用showname方法。编写一个people类,该类有string类型的成员变量firstname和lastname来存放people对象的...
Java 向上转型(Java Upcasting)是一种机制,用于将子类对象转换为父类对象。 Java 向下转型(Java Downcasting)是一种机制,用于将父类对象转换为子类对象。 接口 Java 接口(Java Interface)是一种抽象类,...
java向上转型与向下转型
Java基础精品课12-抽象类录屏1.向下转型和向上转型.mp4
本文将深入探讨Java中的向上转型和向下转型,同时提供简单的实例来帮助理解这些概念。 首先,让我们了解一下向上转型。向上转型(Upcasting)是指将子类对象赋值给父类引用。在Java中,这是自动完成的,因为子类...
向上转型是面向对象编程中的一个重要概念,主要应用于Java等支持多态特性的语言。它指的是将子类的对象赋值给父类的引用,这样就可以通过父类引用来调用子类中继承自父类的方法。在Java中,这种转换是自动的,无需...
什么是向下转型和向上转型
Java基础精品课12-抽象类录屏3.方法传参时完成向上转型.mp4
本文将深入探讨对象引用与对象的区别、多态性、向上转型和向下转型以及栈和堆内存的管理。 首先,让我们了解对象引用与对象的区别。对象是根据类实例化出来的实体,它们在内存中的位置通常在堆区,具有实际的数据和...
1. 向下转型必须先向上转型,否则会发生异常。 2. 下转型对象可以引用子类和父类的属性和方法。 代码示例: ```java public class Shangz { int a = 1; int b = 2; void cal() { System.out.println(a * b); ...
其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解。 但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子类实例赋值给父类引用,在将父类引用向下强转...
- **定义**:将子类的对象赋值给父类的引用,称为向上转型。 - **示例**: ```java Person p = new Student(); ``` - **特点**: - 不需要显式地使用类型转换操作符。 - 父类引用只能访问父类中定义的成员变量...