Java基础学习:面向对象之多态

后端学习评论5.6K1字数 1403阅读4分40秒阅读模式

Java基础学习:面向对象之多态

1、定义

同一个对象,在程序不同时刻的多种运行状态,父类或者接口的引用指向子类对象。举例:水(气态,液态,固态)文章源自亦枫博客-https://yflad.cn/2006.html

 文章源自亦枫博客-https://yflad.cn/2006.html

2、实现多态的前提条件

1. 必须有继承或者实现关系文章源自亦枫博客-https://yflad.cn/2006.html

2. 必须有方法的重写文章源自亦枫博客-https://yflad.cn/2006.html

3. 父类(接口)的 引用指向子类(实现)的对象文章源自亦枫博客-https://yflad.cn/2006.html

 文章源自亦枫博客-https://yflad.cn/2006.html

3、多态的好处和弊端:

好处:文章源自亦枫博客-https://yflad.cn/2006.html

多态的存在提高了程序的扩展性和后期可维护性文章源自亦枫博客-https://yflad.cn/2006.html

弊端:文章源自亦枫博客-https://yflad.cn/2006.html

虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。不能预先使用子类中定义的特有功能。文章源自亦枫博客-https://yflad.cn/2006.html

 文章源自亦枫博客-https://yflad.cn/2006.html

4、多态中对象调用成员的特点

java在执行的时候分为两个时期:编译期,运行期文章源自亦枫博客-https://yflad.cn/2006.html

父类 子类 = 子类对象文章源自亦枫博客-https://yflad.cn/2006.html

Fu f = new Zi();

A:成员变量:编译期看类型,运行期看类型文章源自亦枫博客-https://yflad.cn/2006.html

编译看左边,运行看左边文章源自亦枫博客-https://yflad.cn/2006.html

B:成员方法:编译期看类型,运行期看对象文章源自亦枫博客-https://yflad.cn/2006.html

编译看左边,运行看右边文章源自亦枫博客-https://yflad.cn/2006.html

C:静态方法:编译期看类型,运行期看类型文章源自亦枫博客-https://yflad.cn/2006.html

编译看左边,运行看左边文章源自亦枫博客-https://yflad.cn/2006.html

 文章源自亦枫博客-https://yflad.cn/2006.html

5、多态的思想:

指挥同一批对象做事情。举例:带兵打仗,下课等。

 

6、多态的一个局限性:

只能够访问父类的成员变量和成员方法,不能访问子类自身对象里面的成员变量和成员方法

如何解决这个局限性,可以使用[code]向下转型[/code]来操作

Son son = (Son) father;
son.love = "爱好";

7、案例:

儿子装爹的故事:小明会教数学这门课,他儿子会教人打游戏。今天小明出门给别人培训数学去了,儿子在家打游戏。正好客户上门请小明去授数学课,开出100元。儿子想着把这笔钱挣下来买皮肤。请客人先回去父亲稍后就到。客户走了之后儿子穿上父亲的衣服,带上父亲的帽子,粘上胡子,装爹出发了。来到客户家教“数学”。实际教的是打游戏,说下节课在教数学。

package com.auto.oop;
/**
 *父类
 */
public class Father {
	String name;
	int age;

	public void teach(){
		System.out.println("教语文");
	}
}

package com.auto.oop;
/**
 * 小明的儿子
 */
public class Son extends Father{
   String love;
   @Override
   public void teach(){
	   System.out.println("教打游戏");
   }
   public void  play(){
	   System.out.println("吃鸡");
   }
}

package com.auto.oop;

public class TestSon {
public static void main(String[] args) {
	//向上造型
	Father father=new Son();//儿子装爹
	father.name="小明";
	father.age=44;
	father.teach();//访问的是父类的方法,但执行的是子类重写后的方法
    //向下造型
	Son son=(Son) father;//装爹完成之后做回自己
	//做回自己的时候可以访问自身的成员变量和成员方法
	son.love="游戏";
	son.play();
}
}

小明儿子装爹上完一节课之后回家了,脱下外套和帽子,拿下胡子,做回自己,拿着挣的100元买装备。

备注:向下造型的时候需要注意转换的类型是否是需要的类型,可能会导致类型转换异常

可以通过[code]instanceof[/code]关键字来避免类型转换异常

instanceof关键字作用:判断当前引用是否属于指定的对象类型

继续阅读
扫扫关注公众号
weinxin
我的微信
扫扫体验小程序
weinxin
我的公众号
亦枫
  • 本文由 发表于 2018年12月5日 18:01:41
评论  0  访客  0
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定