对象多态性分析

所谓对象多态性即是指子类与父类之间的相互转换关系。

向上转型:父类  父类对象 = 子类实例

向下转型:子类  子类对象 = (子类) 父类实例

只有先进行向上转型才能向下转型

<pre name="code" class="java">class A{
	public void fun1(){
		System.out.println("1、A类 --> public void fun1(){}") ;
	}
	public void fun2(){
		this.fun1() ;
	}
};
class B extends A{
	public void fun1(){	// 将方法覆写了
		System.out.println("2、B类 --> public void fun1(){}") ;
	}
	public void fun3(){	// 此操作为子类自己定义的,父类中不存在
		System.out.println("3、B类 --> public void fun3(){}") ;
	}
};
public class PolDemo02{
	public static void main(String args[]){
		A a = new B() ;	// 发生向上转型关系,子类实例 --> 父类实例
		B b = (B)a ;	// 发生向下转型关系,强制
		b.fun3() ;
		b.fun2() ;
	}
};

让我们来看一个例子,通过实例来体现对象多态性在程序设计中的所用。

现在要求设计一个方法,该方法可以接收某个类所有子类的实例

首先给出三个类A、B、C

class A{
	public void fun1(){
		System.out.println("1、A类 --> public void fun1(){}") ;
	}
	public void fun2(){
		this.fun1() ;
	}
};
class B extends A{
	public void fun1(){	// 将方法覆写了
		System.out.println("2、B类 --> public void fun1(){}") ;
	}
	public void fun3(){	// 此操作为子类自己定义的,父类中不存在
		System.out.println("3、B类 --> public void fun3(){}") ;
	}
};
class C extends A{
	public void fun1(){	// 将方法覆写了
		System.out.println("4、C类 --> public void fun1(){}") ;
	}
	public void fun4(){	// 此操作为子类自己定义的,父类中不存在
		System.out.println("5、C类 --> public void fun4(){}") ;
	}
};

我们直接定义的接受子类实例的方法

public class PolDemo04{
	public static void main(String args[]){
		fun(new B()) ;
		fun(new C()) ;
	}
	public static void fun(B b){
		b.fun2() ;
		b.fun3() ;
	}
	public static void fun(C c){
		c.fun2() ;
		c.fun4() ;
	}
};

如上,通过重载fun()方法接收了A类所有子类的实例,但如果A类子类比较多,这样写将会需要大量的代码量

考虑到每一个子类都可以自动向上转型,我们可以利用这个特点

public class PolDemo06{
public static void main(String args[]){
fun(new B()) ;
fun(new C()) ;
}
public static void fun(A a){
a.fun2() ;
B b = (B)a ;
b.fun3() ;
}
};

这样,就实现了我们目的,但考虑到传入fun函数的实例不确定是哪一个子类的对象,java设计者设计了一个instance()方法来辨别。

public class PolDemo08{
	public static void main(String args[]){
		fun(new B()) ;
		fun(new C()) ;
	}
	public static void fun(A a){
		a.fun2() ;
		if(a instanceof B){
			B b = (B)a ;
			b.fun3() ;
		}
		if(a instanceof C){
			C c = (C)a ;
			c.fun4() ;
		}
	}
};
时间: 2024-11-08 12:01:25

对象多态性分析的相关文章

JVM的内存区域划分,对象实例化分析

一.JVM程序具体执行过程 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:                                     如上图所示,Java源代码文件(.java后缀)经过Java编译器编译成为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行.在整个程序执行过程中,JVM会用一

Java面向对象_对象内存分析—值传递和引用传递

对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者说是实例化对象或者说是申请内存空间,所有程序运行都需要内存来存储数据,这样内存的概念就出来了.举个例子说明:定义一个类Person,属性:char a;int sge;那么创建一个对象申请的内存空间就是所有属性所占字节之和,为6个字节. 详细理一下对象在内存中的结构: Person p=new Pe

C++--函数对象的分析 经典问题

一.函数对象的分析 Q:客户的需求1.函数可以获得斐波那契数列每项的值2.每调用一次返回一个值3.函数可根据需求重复使用 for(int i=0;i<10;i++) { cout<<fib()<<endl; } 代码示例 #include <iostream> #include <string> using namespace std; int fib() { static int a0=0; static int a1=1; int ret=a1;

方法与对象内存分析

---方法区内存:在类加载的时候,class字节码代码段被加载到该内存空间中---栈内存(局部变量):方法代码段片段执行的时候,会给该方法分配内存空间,在栈内存中压栈,执行完毕之后释放内存空间,做弹栈操作.---堆内存(实例变量):new的对象在堆内存中存储.方法内存分析 public class Hello { public static void main(String[] args) { int a = 100; int b = 200; int res = sum(a, b); Syst

对象多态性

基本概念的解释. 多态性的依赖条件是方法的覆写!! 观察如下的一个程序: class A{ public void print(){ System.out.println("A--print()") ; } } class B extends A{ public void print(){ System.out.println("B--print()") ; } } public class Test{ public static void main(String

HQL查询——查询返回对象类型分析

关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(String hql)方法得到的.我这里要分析HQL的select子句,当然要想深入HQL查询,我们就必须了解hibernate缓存的知识. 一.选择--Select子句查询返回对象的讨论 为什么只说Select子句,因为我们使用的hibernate框架是基于java语言环境下进行开发的,也就是说hibe

POI 导入excel数据自己主动封装成model对象--代码分析

上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化数据信息 4.推断单元格类型.主要难点为日期类型的推断,假设对poi的API不是非常熟悉可能会有点难下面手(我也是百度的.) String value = null; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_BOOLEAN: val

C++ 多态性分析

编译 - 时间多态性--函数重载 编译后的中间代码(例如GCC产生.o文件.此时还不是汇编语言)函数名字有变化,看以下两个样例. void cc_show(const char*str)     ->    _Z7cc_showPKc void cc_show(int x)            ->     _Z7cc_showi 大家能够看到,函数名事实上不同,与返回值.函数名.參数有关. 函数重载的规则就是參数的个数或种类必须不同,所以就不会有混乱了. 执行时多态--virtual动态绑

在Javascript 中创建JSON对象--例程分析

作者:iamlaosong 要想用程序从网页上抓数据,需要熟悉HTML和JavaScript语言,这里有一个在Javascript 中创建JSON对象的例程,学习并掌握其内容,在此对此例程做个注释,记录我掌握的知识,以备将来验证是否正确. 程序很简单,分三部分: 1.<h2>部分:用大字符显示标题: 2.<p>部分:显示一段信息的结构,但无内容,内容在后面添加: 3.<scrip>部分:Javascript程序,先定义了一个JSON结构的变量JSONObject,然后,