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

  • A+
所属分类:后端开发

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

1、定义

同一个对象,在程序不同时刻的多种运行状态,父类或者接口的引用指向子类对象。举例:水(气态,液态,固态)

 

2、实现多态的前提条件

1. 必须有继承或者实现关系

2. 必须有方法的重写

3. 父类(接口)的 引用指向子类(实现)的对象

 

3、多态的好处和弊端:

好处:

多态的存在提高了程序的扩展性和后期可维护性

弊端:

虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。不能预先使用子类中定义的特有功能。

 

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

java在执行的时候分为两个时期:编译期,运行期

父类 子类 = 子类对象

Fu f = new Zi();

A:成员变量:编译期看类型,运行期看类型

编译看左边,运行看左边

B:成员方法:编译期看类型,运行期看对象

编译看左边,运行看右边

C:静态方法:编译期看类型,运行期看类型

编译看左边,运行看左边

 

5、多态的思想:

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

 

6、多态的一个局限性:

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

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

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
亦枫

发表评论

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