黑马程序员——面向对象(多态)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 


多态:可以理解为事物存在的多种体现形态。

人:男人,女人。

动物:猫,狗。


猫 x = new 猫();(实体)

动物 x = new 猫();


1、多态的体现

父类的引用指向了自己的子类对象。

父类的引用也可以接收自己的对象。


2、多态的前提

必须是类与类之间有关系,要么继承要么实现。

通常还有一个前提:存在覆盖。


3、多态的好处

多态的出现提高了程序的扩展性,但是只能使用父类的引用访问父类中的成员。


4、 多态的弊端

虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。



Animal a = new Cat();//类型提升。向上转型

如果想要调用猫的特有方法时,强制将父类的引用转成子类类型。向下转型

(Cat)a.Cat特有方法。//向下转型

注意:不能将父类对象转成子类类型。

能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。

多态自始至终都是子类对象在做变化。


instanceof  类型比较关键字

格式:a instanceof Cat


多态程序举例:

程序一:

<span style="font-size:18px;">class Fu
{
	void method1()
	{
		System.out.println("fu method_1");
	}
	void method2()
	{
		System.out.println("fu method_2");
	}
}

class Zi extends Fu
{
	void method1()
	{
		System.out.println("zi method_1");
	}
	void method3()
	{
		System.out.println("zi method_3");
	}
}

public class DuoTaiDemo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Zi z = new Zi();
		z.method1();
		z.method2();
		z.method3();
	}
	</span>
运行结果:

zi method_1
fu method_2
zi method_3
      

原因:在子类中method1()覆盖父类的方法;method2()继承父类的方法;method3()子类特有的方法。

程序二:

public class DuoTaiDemo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		//Zi z = new Zi();
		//z.method1();
		//z.method2();
		//z.method3();
		Fu f = new Zi();
		f.method1();
		f.method2();
		((Zi)f).method3();
	}
运行结果:

zi method_1
fu method_2
zi method_3
    

原因:子类向上转型,转型后还是调用子类的方法,对于子类特有方法必须进行向下转型后调用。

在多态中成员函数的特点:

在编译时期:查阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,没有则便于失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

总结:成员函数在多态调用时,编译看左边,运行看右边。

程序三:

class Fu
{
	int num = 5;
}

class Zi extends Fu
{
	int num = 8;
}

public class DuoTaiDemo {
	public static void main(String[] args) {
		Fu f = new Zi();
		System.out.println(f.num);
		
		Zi z = new Zi();
		System.out.println(z.num);
	}
}
运行结果:

5

8

在多态中,成员变量的特点: 无论编译和运行,都参考左边(引用型变量所属的类)。

即便是所属类中有这个变量,而引用型变量中没有,引用型变量就不可以调用。

如:int num1 = 1;存在子类中不存在父类中。而Fu f = new Zi(); f.num1编译不通过。

class Fu
{
	static void method4()
	{
		System.out.println("fu method_4");
	}
}

class Zi extends Fu
{
	static void method4()
	{
		System.out.println("zi method_4");
	}
}

public class DuoTaiDemo {
	public static void main(String[] args) {
		Fu f = new Zi();
		f.method4();
		
		Zi z = new Zi();
		z.method4();
	}
}
结果:

fu method_4
zi method_4

原因:在多态中,静态成员函数,无论是编译和运行,都参考左边。 

注:静态变量不需要创建对象就可以引用。Fu.method4(); Zi.method4();

在多态中:静态变量绑定是静态绑定,非静态变量绑定是动态绑定。


接口与多态应用示例:

/*
 * 需求:
 * 电脑运行示例,
 * 电脑运行基于主板。
 */

interface PCI
{
	public void open();
	public void close();
}

class MainBoard
{
	public void run()
	{
		System.out.println("mainboard run");
	}
	public void usePCI(PCI p)//PCI p = new NetCard() 接口型引用指向自己的子类对象
	{
		if(p!=null)
		{
			p.open();
			p.close();
		}
	}
}

class NetCard implements PCI
{
	public void open()
	{
		System.out.println("netcard open");
	}
	public void close()
	{
		System.out.println("netcard close");
	}
}

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值