有时候需要把父类对象指向子类对象,有时候需要把父类对象转换成子类对象。例如我们可以说某一只狗是一只动物,还可以说这只动物是一条狗,但前提是我们要知道狗肯定是动物,而那只动物必须是一只狗。下面介绍如何把父类指向子类对象,如何把子类对喜爱那个强制转换成子类对象。
1、父类引用指向子类对象
正常情况下,我们会定义某个类的对象引用,然后使用new实例化一个对象,然后把这个引用指向该实例。例如:
Dog dog = new Dog();
假设Dog是Animal的子类,也可以写下面的代码:
Animal animal = new Dog();
Animal animal定义了一个Animal对象引用,new Dog()实例化了一只狗,然后animal指向了这只狗。 这是允许的,就像我们指着一只狗,然后说它是动物,它确实是动物。
还可以写成下面的形式:
Animal animal = dog;
意思是把animal引用指向dog引用指向的实例。
这就是向上转型,不仅仅是父类可以指向子类的对象,只要是祖先类都可以指向子类的实例。典型情况,Object是所有类的祖先类,所以Object类型的对象引用可以指向任何对象。例如下面的代码:
Object o = new Dog();
把父类引用指向子类对象的好处是什么呢?自己可以思考一下,后面的多态性应用中详细介绍。
另外,类似的用法还有:
某个方法的定义如下:
public void setValue(Object o){
this.value = o;
}
这个方法的参数是Object类型,返回值类型是Object。因为参数类型是Object,所以在调用这个方法的时候我们可以给它传递任何类型的参数,包括上面的Dog对象,只要是它的子孙类就可以了。
再看下面的方法:
public Object getValue(){
return value;
}
value可以是任何类型,Dog实例,Animal实例,Date实例,Person实例都可以。
想想数据结构中的链表、队列等等,他们的元素可以是各种类型,就可以使用这种方式,可以设置整数链表、Dog链表,获取它的元素的时候,返回值的类型由元素类型决定,所以参数和返回值类型都应该设置为Object。
总结一句话:任何需要父类对象地方都可以给子类对象。
2、强制类型转换
我们可以把父类引用指向子类对象,但是这样带来的其他问题。假设Dog有一个特殊的行为方法f,如果把Dog实例赋值给了Animal引用,例如下面的代码:
Animal animal = new Dog();
如何访问Dog的f方法呢?
直接写animal.f()肯定不行,编译不能通过,因为animal没有方法f()。
所以这时候还需要把animal再转换成Dog才可以访问方法f。能这样写吗?
Dog d = animal;
不能,变异的时候就会报错类型不匹配。可以使用下面的代码:
Dog d = (Dog)animal;
强制把animal转换成了Dog,也就是把动物转换成了狗。这就是强制类型转换,把父类对象转换成子类对象(子类对象引用指向了父类对象)。
能转换吗?因为我们知道这只动物确实是狗,所以可以转换。
再看下面的代码:
Animal animal = new Cat();
Dog d = (Dog)animal;
单从第2行看,与之前的代码没有区别。但是大家一看就知道有问题,因为代码想把猫转换成狗,这时候会报错的:ClassCastException
这种错误不是语法错误,所以能够编译通过,但是在运行的时候出错。
所以在进行强类型转换的时候,我们要确保能够转换,只有当父类指向的实例是某个子类的对象的时候才可以转换成该类的对象。
如果不能确定可以通过instanceof操作符进行判断。
if(animal instanceof Dog)
Dog d = (Dog)animal;
<!--EndFragment-->
分享到:
相关推荐
Java 向上转型与向下转型 Java 转型是 Java 编程中的一种非常重要的概念,主要包括向上转型和向下转型两种。向上转型是指将子类对象转换为父类对象,而向下转型是指将父类对象转换为子类对象。 向上转型...
Java提供了两种主要的转型方式:自动类型转换(也称为隐式转换)和强制类型转换(也称为显式转换)。理解并熟练掌握这些转换对于编写高效、正确的代码至关重要。 ### 自动类型转换(隐式转换) 当我们将一个数据...
向下转型与向上转型相反,它是指将父类的引用强制转换为子类的引用。这种转型通常需要显式地使用类型转换操作符。例如: ```java MMGirl mmg = (MMGirl) g1; ``` 其中,`g1`是一个`Girl`类型的引用,但它实际上...
7. **强制类型转换**:虽然上转型对象不能直接访问子类特有的方法或属性,但可以通过强制类型转换恢复到子类类型,然后进行访问。需要注意的是,不正确的类型转换会导致ClassCastException。 8. **抽象类与接口**:...
Java 上转型和下转型对象 Java 中的上转型和下转型对象是对象之间的类型转换关系,用于描述父类和子类之间的继承关系。在 Java 中,我们可以通过上转型和下转型来实现对象之间的类型转换。 上转型对象 上转型对象...
2. 把子类对象直接赋给父类引用叫向上转型,向上转型不需要强制转换。 3. 向下转型需要注意安全问题,可以使用 `instanceof` 关键字来避免出错。 在 Java 编程中,理解向上转型和向下转型的概念是非常重要的,它们...
- **向下转型(强制转型)**:若需要将父类引用转换为子类类型,必须显式进行强制类型转换。例如,`MyClass childRef = (MyClass) parentRef;`。但要注意,只有当父类引用实际指向的是子类对象时,这种转换才是安全...
理解并熟练运用Java中的向上转型和向下转型是掌握面向对象编程的关键。向上转型简化了代码,提高了代码的通用性,而向下转型则提供了访问子类特定功能的能力。在实际开发中,需谨慎使用向下转型,并确保在转型前进行...
需要注意的是,向上转型不要强制转型。向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。 向上转型后父类引用不能调用...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
Java是一种广泛使用的面向对象的编程语言,其设计目标是...在团队转型技术培训中,掌握这些基本概念可以帮助团队更好地理解和协作开发Java项目。通过深入学习和实践,可以提升团队的技术水平,提高项目的质量和效率。
在Java中,向下转型是通过强制类型转换实现的。例如,我们可以将父类对象Electronics转换为子类对象Thinkpad,Mouse或Keyboard。这种转换可以满足不同的需求,例如在购物车系统中,我们可以将Thinkpad、Mouse和...
在Java中,类型转换主要分为两大类:**隐式自动类型转换**和**强制手动类型转换**。 #### 隐式自动类型转换 隐式自动类型转换指的是Java编译器自动完成的类型转换过程。这种类型的转换通常发生在较小的数据类型向较...
多态的概念主要体现在向上转型中,Java 允许把子类对象赋值给父类的引用变量,不用做任何强制转换,系统自动完成。 向上转型来自于自下而上的继承关系,子类继承父类,子类是一种特殊的父类,所以向上转型的操作...
本文将深入探讨Java中的向上转型和向下转型,同时提供简单的实例来帮助理解这些概念。 首先,让我们了解一下向上转型。向上转型(Upcasting)是指将子类对象赋值给父类引用。在Java中,这是自动完成的,因为子类...
- **强制转型与自动转型**:在 JAVA 中,子类对象可以自动转换为父类类型(自动转型),而父类对象转为子类类型时需要显式转换(强制转型)。 - **空指针异常**:当试图访问一个 null 对象的成员变量或调用其方法时...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
向下转型可以通过强制类型转换实现,格式如下: ```java 子类类型 变量 = (子类类型) 父类引用; ``` 例如: ```java Animal animal = new Cat(); // 假设Cat是Animal的子类 Cat cat = (Cat) animal; ``` 4...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
此谜题可能涉及到父类引用指向子类对象的情况,以及在转型过程中的注意事项,比如安全转型和强制转型。 谜题7:互换内容 在Java中,交换两个变量的值通常是通过中间变量或位运算实现的。不使用额外变量的交换方法是...