Java对象的多态性(转型)
多态性在面向对象中主要有两种体现:
<1>方法的重载与覆写
<2>对象的多态性
对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成
向下转型:父类对象-->子类对象,向下转型时,必须明确地指明转型的子类类型
对象的向上转型
虽然使用的父类对象调用fun1方法,但是实际上调用的方法是被子类覆写过的方法,也就是说,如果对象发生了向上转型关系后,所调用的方法一定是被子类覆写过的方法。
但是父类的a无法调用b类中的fun3方法,因为这个方法只在子类中定义,而没有在父类中定义。
//=================================================
// File Name : ploy_up_demo
//------------------------------------------------------------------------------
// Author : Common // 类名:C_1
// 属性:
// 方法:
class C_1{ // 定义接口C_1
public void fun1(){ //定义fun1()方法
System.out.println("C_1--->public void fun1");
} public void fun2(){ //定义fun2()方法
this.fun1();
}
} //类名:D_1
//属性:
//方法:
class D_1 extends C_1{ //子类D_1继承父类C_1
public void fun1(){
System.out.println("D_1--->public void fun1"); //覆写父类中的fun1()方法
} public void fun3(){
System.out.println("D_1--->public void fun3"); //子类自己定义方法
}
} //主类
//Function : 对象的多态性,对象向上转型
public class ploy_up_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
D_1 b = new D_1(); //定义子类的实例化对象
C_1 a = b; //声明一个父类,发生向上转型的关系,子类赋值给父类
a.fun1(); //此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法
} }
对象的向下转型
在子类中调用了父类中的fun2方法,fun2方法要调用fun1方法,但是此时fun1方法已经被子类覆写过了,所以调用fun2方法的时候还是调用被子类覆写过的方法
在进行对象的向下转型之前,必须首先发生对象的向上转型,否则将出现对象转换异常
//=================================================
// File Name : ploy_up_demo
//------------------------------------------------------------------------------
// Author : Common // 类名:C_1
// 属性:
// 方法:
class C_1{ // 定义接口C_1
public void fun1(){ //定义fun1()方法
System.out.println("C_1--->public void fun1");
} public void fun2(){ //定义fun2()方法
this.fun1();
}
} //类名:D_1
//属性:
//方法:
class D_1 extends C_1{ //子类D_1继承父类C_1
public void fun1(){
System.out.println("D_1--->public void fun1"); //覆写父类中的fun1()方法
} public void fun3(){
System.out.println("D_1--->public void fun3"); //子类自己定义方法
}
} //主类
//Function : 对象的多态性,对象向上转型
public class ploy_up_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
// D_1 b = new D_1(); //定义子类的实例化对象
// C_1 a = b; //声明一个父类,发生向上转型的关系,子类赋值给父类
// a.fun1(); //此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法 C_1 c = new D_1(); //声明一个父类,发生了向上转型,子类赋值给父类
D_1 d = (D_1)c; //声明的父类强制转换成子类,发生了向下转型关系
d.fun1();
d.fun2();
d.fun3();
} }
多态的应用
设计一个方法,要求此方法可以接受A类的任意子类对象,并调用方法。
//=================================================
// File Name : ploy_up_demo
//------------------------------------------------------------------------------
// Author : Common // 类名:C_1
// 属性:
// 方法:
class C_1{ // 定义接口C_1
public void fun1(){ //定义fun1()方法
System.out.println("C_1--->public void fun1");
} public void fun2(){ //定义fun2()方法
this.fun1();
}
} //类名:D_1
//属性:
//方法:
class D_1 extends C_1{ //子类D_1继承父类C_1
public void fun1(){
System.out.println("D_1--->public void fun1"); //覆写父类中的fun1()方法
} public void fun3(){
System.out.println("D_1--->public void fun3"); //子类自己定义方法
}
} //类名:E_1
//属性:
//方法:
class E_1 extends C_1{ //子类E_1继承父类C_1
public void fun1(){
System.out.println("E_1--->public void fun1"); //覆写父类中的fun1()方法
} public void fun5(){
System.out.println("E_1--->public void fun3"); //子类自己定义方法
}
} //主类
//Function : 对象的多态性,对象向上转型
public class ploy_up_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
// D_1 b = new D_1(); //定义子类的实例化对象
// C_1 a = b; //声明一个父类,发生向上转型的关系,子类赋值给父类
// a.fun1(); //此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法 // C_1 c = new D_1(); //声明一个父类,发生了向上转型,子类赋值给父类
// D_1 d = (D_1)c; //声明的父类强制转换成子类,发生了向下转型关系
// d.fun1();
// d.fun2();
// d.fun3(); fun(new C_1()); //传递C_1类的实例,产生向上转型
fun(new D_1()); //传递D_1类的实例,产生向上转型
} public static void fun(C_1 c){ //接收父类对象,不用写多次分别接收子类对象
c.fun1();
}
}
Java对象的多态性(转型)的更多相关文章
- java 对象的上转型对象(父类)
Example5_10.java class 类人猿 { void crySpeak(String s) { System.out.println(s); } } class People exten ...
- java上转型和下转型(对象的多态性)
/*上转型和下转型(对象的多态性) *上转型:是子类对象由父类引用,格式:parent p=new son *也就是说,想要上转型的前提必须是有继承关系的两个类. *在调用方法的时候,上转型对象只能调 ...
- 将子类对象引用赋值给超类对象 JAVA 编译时多态性
将子类对象引用赋值给超类对象 JAVA 编译时多态性(转) (2012-05-10 11:24:05) 转载▼ 标签: 杂谈 分类: 也无晴_soft 1.通过将子类对象引用赋值给超类对象引用变量来实 ...
- Java面向对象-对象的多态性
Java面向对象-对象的多态性 Java中的多态性表现: 1,方法的重载和重写(覆盖): 2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现: 我们先搞个父类Animal: ...
- 菜鸡的Java笔记 第二十二 - java 对象多态性
本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的, 而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...
- Java中对象的上转型对象
1. 定义 如果B类是A类的子类或间接子类,当用B类创建对象b并将这个对象b的引用赋给A类对象a时,如: A a;a = new B();ORA a;B b = new B();a = b; 则称A类 ...
- JavaSE(五)JAVA对象向上转型和向下转型
今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...
- JAVA 对象的转型
/* 对象的转型: 1.对象的向上转型 子类转成父类 默认进行 父类引用指向子类对象 2.对象的向下转型 父类转成子类 强制进行 关键字:instanceof 测试左边对象是否是右边类的实例 如果是返 ...
- java中的上转型对象
1. 定义 如果B类是A类的子类或间接子类,当用B类创建对象b并将这个对象b的引用赋给A类对象a时,如: A a;a = new B();ORA a;B b = new B();a = b; 通俗的说 ...
随机推荐
- Git error on commit after merge - fatal: cannot do a partial commit during a merge
Git error on commit after merge - fatal: cannot do a partial commit during a merge this answer is : ...
- Intellij 常用快捷键
Project [Alt+1]Version Control [Alt+9]Run [Ctrl+Shift+F10]Debug [Ctrl+Shift+F11]Terminal [Alt+F12]Ed ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- Fiddler内置命令
我猜你肯定忽略了下边这个小黑框: 虽然它不是很显眼,但用好它,会让你的工作效率提高 N 倍! 这跟喜欢 Linux 的朋友一样,肯定更倾向于用一两个命令代替鼠标不断的点点点操作. Fiddler 将每 ...
- lucene-查询query->FuzzyQuery相近词语的搜索
FuzzyQuery是一种模糊查询,它可以简单地识别两个相近的词语.下面以11.10为例进行详细介绍. package ch11; import org.apache.lucene.analysis. ...
- 【caffe】train_lenet.sh在windows下的解决方案
@tags: caffe python 在windows下配置caffe后,跑mnist手写数字识别的例子.发现train_lenet.sh不能运行. 那就写个python脚本替代吧. step1 定 ...
- 【csuoj1014】 西湖三人行
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1014 (题目链接) 题意 从无向图图上一点到达另一点,可以步行,搭公交或者是打的,不同的交通方式花 ...
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- C#把数据写到硬盘指定位置
FileStream fs; StreamWriter sw;string RootPath = @"C:\Advantech" + "\\tempData\\" ...
- 通过oauth 认证 新浪微博 开发过程中遇到的问题
1 Android之NetworkOnMainThreadException异常 http://blog.csdn.net/mad1989/article/details/25964495 ,从Hon ...