JAVA 多态操作----父类与子类转换问题实例分析

本文实例讲述了JAVA 多态操作----父类与子类转换问题。分享给大家供大家参考,具体如下:

JAVA语言中, 对象变量是多态的

每个子类对象都算是父类对象(子类对象可以当作父类变量所引用)

那反过来可不可以呢?

答案是取决于父类变量引用的是谁

如果父类变量引用的是子类对象的实例, 可以通过强转被子类变量引用

如果父类变量引用的是父类对象的实例,则不能被为子类变量引用

上代码举例子(本篇一直用这两个类举例子,main测试不同):

一个Father类

package test;

public class Father
{
	int fatherA;
	Father(int a)
	{
		fatherA=a;
	}
}

一个Son类

package test;

public class Son extends Father
{
	int sonB;
	Son(int a,int b)
	{
		super(a);
		sonB=b;
	}

}

把子类对象赋给父类变量:

package test;

public class MainTest
{

	public static void main(String[] args)
	{
		Son son1=new Son(1, 2);
		Father father1=son1;	//子类对象被父类变量引用
		System.out.println(father1.fatherA);
	}

}

结果: 赋值成功!

把父类引用赋值给子类变量分两种情况:

1.父类引用的是子类对象:

package test;

public class MainTest
{

	public static void main(String[] args)
	{
		Father father2=new Son(1, 2);	//父类引用了子类对象的实例
		Son son2=(Son)father2;
		System.out.println(son2.sonB);
	}

}

结果:转换成功!

这里注意即使引用的是子类实例转换成子类也需要强转, 否则会报错

2.父类引用的是父类的实例:

package test;

public class MainTest
{

	public static void main(String[] args)
	{
		Father father2=new Father(1);	//父类引用了子类对象的实例
		Son son2=(Son)father2;
		System.out.println(son2.sonB);
	}

}

结果:失败!

结论:

  • 子类对象可以当作父类对象使用(子类的引用可以赋值给父类变量),
  • 父类的引用如果是:
  1. 子类的实例,  可以通过强转赋值给子类引用
  2. 父类的实例, 不能被子类引用

其实细想new出的对象之间本身是不能转换的, 我们赋值的是类的引用,

总的来说就是父类变量可以应用父类实例, 也可以引用子类实例,

子类变量只能引用子类实例

这也就是开篇所说的 : 子类对象算是父类对象

更多关于java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java中子类调用父类构造方法的问题分析

    在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下:    当你new一个子类对象的时候,必须首先要new一个父类的对像出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要new父类对象出来,那么肯定要调用其构造方法,所以: 第一个规则:子类的构造过程中,必须调用其父类的构造方

  • java父类和子类初始化顺序的深入理解

    继承类的构建过程是向外扩散的,子类初始化了,父类一定也初始化了 复制代码 代码如下: class Art{ Art(){  System.out.println("Art"); }}class Drawing extends Art{ Drawing(){  System.out.println("Drawing"); }}public class Cartoon extends Drawing { Cartoon(){  System.out.println(&q

  • java中重载,继承,重写和多态的区别

    重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员. 2)重写是继承后重新实现父类的方法. 3)重载是在一个类里一系列参数不同名字相同的方法. 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法. 下面的例子包含了这四种实现: class Triangle extends Shape { public int getSides() {   return 3;  } } class Rectang

  • Java封装、继承、多态三大特征的理解

    首先先简单的说一下其3大特性的定义: 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别.将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员.封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员.封装的基本要求是: 把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的

  • Java面向对象编程(封装/继承/多态)实例解析

    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容. 封装 封装一个Teacher和Student类 package com.hz.test; public class Teacher { private String name; private String majorDirection; private String teachCourse; private int teachAge; public Teacher() { super(); } public Teacher(Stri

  • java中多态概念、实现原理详解

    一.什么是多态? 1.多态的定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用) 2.多态的作用 消除类型之间的耦合关系 3.多态的说明 近代网络小说泛滥,我们可以用它来举一个例子 某日你看见你手机上有多部小说同时更新了,比如有大主宰,雪鹰领主,龙王传说-在这里我们可以描述成如下: 小说a=大主宰 小说b=雪鹰领主 小说c=龙王传说 - 这里所表现的就是多态,大主宰,雪鹰领主,龙王传说都是小说的子类,我们仅仅可以通过小说这个

  • 关于Java三大特性之多态的总结

    面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 2.实现多态的技术称为:动态绑定(dynamicbinding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 3.作用:消除类型之间的耦合关系. 4.现实中,关于多态的例子不胜枚举.比方说按下F1

  • java用接口、多态、继承、类计算三角形和矩形周长及面积的方法

    本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 上午08:56:48 */ package com.duotai; /** * * */ public interface Shape { public double area(); public double longer(); } /** * @author vvv * @date 2013-8

  • Java中父类怎么调用子类的方法

    父类能调用子类的方法吗? 答:能. 怎么做? 把子类传递到父类的有参构造中,然后调用. 使用反射的方式调用,你使用了反射还有谁不能调用的?! 父类调用子类的静态方法. 案例展示: package com.ywq; public class Test2{ public static void main(String[] args) { Son son = new Son(); Father father=new Father(son); father.fun1(); father.fun4();

  • 浅谈Java中父类与子类的加载顺序详解

    复制代码 代码如下: class Parent {    // 静态变量    public static String p_StaticField = "父类--静态变量";    // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例)     //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化    public String p_Field = "父类--变量";    // 静态初始化块    static {        S

随机推荐