1.12(java学习笔记)多态及向上、向下转型
2018-07-24 07:53:27来源:博客园 阅读 ()
一、多态
多态是指同一个方法被调用,由于对象不同导致行为不同。
例如调用自由活动方法,张三喜欢玩耍,那么他就会去玩耍。
李四喜欢学习,那么他可能去学习。调用方法因对象的不同
而产生了不同的行为。
形成多态的三个条件:
1.继承
2.子类重写父类方法。
3.父类类型,子类对象。
以下列代码为例:
1 public class Test { 2 public static void main(String[] args) { 3 Student stu = new Student(); 4 Teach tea = new Teach(); 5 freeActivi(stu); 6 freeActivi(tea); 7 } 8 9 static void freeActivi(Person per){//实现多态的条件之父类类型,子类对象 10 per.freeActivi(); //这样对象不同可以展现出不同的行为 11 } //虽然参数类型是父类Person,但子类对象(stu,tea)会自动向上转型 12 //成Person,但调用的还是被子类重写的方法。 13 } 14 15 class Person{ 16 void freeActivi(){ 17 System.out.println("自由时间"); 18 } 19 } 20 21 class Student extends Person{ //实现多态的条件之继承 22 void freeActivi(){ //实现多态的条件之重写 23 System.out.println("玩耍"); 24 } 25 } 26 27 class Teach extends Person{ 28 void freeActivi(){ 29 System.out.println("备课"); 30 } 31 }
运行结果:
玩耍
备课
可能大家会说多态有什么好处?
如果没有多态,那么每一个子类都需要重写定义以方法,例如:
static void freeActivi(Student per){ per.freeActivi(); } static void freeActivi(Teach per){ per.freeActivi(); }//假如有几十种类型,一个一个创建对应的方法就很麻烦。
如果没有多态,那么不同类型需要一个个创建方法,方法一多就非常麻烦,有了多态可以省去很多步骤。
二、转型
可能大家不是很能理解static void freeActivi(Person per)这里的Person类型。结合下面的向上转型大家可能更好理解。
对象向上转型 父类 父类对象 = 子类对象 将子类对象转为父类对象,例如 Person per = stu;
用下面代码便于大家理解
1 public class Test { 2 public static void main(String[] args) { 3 Student stu = new Student(); //首先创建了一个子类对象 4 Person per = stu; //然后将子类对象向上转型 5 per.freeActivi(); //然后调用父类对象中的方法。 6 } 7 //运行后我们发现,结果是玩耍,并不是自由时间。 8 //如果对象发生向上转型,调用的一定是被子类重写的方法。 9 } 10 11 class Person{ 12 void freeActivi(){ 13 System.out.println("自由时间"); 14 } 15 } 16 17 class Student extends Person{ 18 void freeActivi(){ 19 System.out.println("玩耍"); 20 } 21 }
运行结果:
玩耍
如果将一个子类对象向上转型后,则调用的父类方法是被子类重写之后的方法,因此可以实现多态。
但是向上转型后的对象,无法在调用子类中方法,例如将Student 类的stu对象向上转型成Person。
此时只能调用Person中的方法,无法调用Student中的方法,此时需要向下转型才能调用Student中的方法。
子类 子类对象 = (子类)父类对象; 向下转型, 父类对象转为子类对象。
如下代码:
1 public class Test { 2 public static void main(String[] args) { 3 Person stu = new Student(); //这里发生了向上转型,父类 父类对象 = 子类对象。 4 Student stu_s = (Student)stu; //这里又发生了向下转型 5 stu_s.test(); //转型完后才可以调用子类中的test方法,没有转型是无法调用的。 6 7 } 8 } 9 10 class Person{ 11 void freeActivi(){ 12 System.out.println("自由时间"); 13 } 14 15 } 16 17 class Student extends Person{ 18 void freeActivi(){ 19 System.out.println("玩耍"); 20 } 21 void test(){ 22 System.out.println("test"); 23 } 24 }
运行结果:
test
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash