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

------- Android培训 java培训 、期待与您交流! ----------

面向对象的第三个特征:多态
定义:某一类事物的多种存在形态
例:动物中猫、狗
猫这个对象对应的类型是猫类型:猫 x=new 猫();
同时猫也是动物中的一种,也可以把猫称为动物:动物 y=new 猫();
动物是猫和狗具体事物中抽取出来的父类型。
父类型引用指向了子类对象。

多态:可以理解为事物存在的多种体现形态
人:男人,女人
动物:猫、狗
猫 x=new 猫();

动物 x=new 猫();


1、多态的体现
      父类的引用指向了自己的子类对象
      父类的引用也可以接收自己的子类对象

 2、多态的前提
       必须是类与类之间有关系,要么继承,要么实现
       通常还有一个前提:存在覆盖
 
3、多态的好处
      多态的出现大大的提高了程序的扩展性。
  
4、多态的弊端:
      提高了扩展性,但是只能使用父类的引用访问父类中的成员。
    
5、多态的应用

6、多态的出现代码中的特点(多态使用的注意事项)

class DuoTaiDemo

{
Animal a=new Cat();//类型提升,向上转型
        a.eat();
}

如果想要调用猫的特有方法时如何操作?
        Cat c=new Cat();
        c.catchMouse();
这样写是错的,因为Cat c=new Cat();这句话是另一只猫去干抓老鼠的事儿了
  
应该强调将父类的引用转成子类类型。向下转型
        Cat c=(Cat)a;
        c.catchMouse();
   
但如果写成以下形式又是错误的了,因为不能强制将一个动物转成猫。
千万不要出现这样的操作,将父类对象转成子类类型。
我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换。
多态自始至终都是子类对象在做着变化
       Animal c=new Animal();
       Cat c=(Cat)a;


在多态中,成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过;如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

class Fu13
{
	void method_1()
	{
		System.out.println("Fu method_1");
	}
	void method_2()
	{
		System.out.println("Fu method_2");
	}
}
class Zi13 extends Fu13
{
	void method_1()
	{
		System.out.println("Zi method_1");
	}
	void method_3()
	{
		System.out.println("Zi method_3");
	}
}
class ExtendsDemo15
{
	public static void main(String[] args)
	{
		Fu13 f=new Zi13();
		f.method_1();//这句运行结果是"Zi method_1",因为虽然子化妆成了父但调用的仍是子的方法
		f.method_2();
		//f.method_3();如果加上这句就会编译失败,因为父类中没有“method_3()”方法
	}
}

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

class Fu14
{
	int num=5;
	void method_1()
	{
		System.out.println("Fu method_1");
	}
	void method_2()
	{
		System.out.println("Fu method_2");
	}
}
class Zi14 extends Fu14
{
	int num=8;
	void method_1()
	{
		System.out.println("Zi method_1");
	}
	void method_3()
	{
		System.out.println("Zi method_3");
	}
}
class ExtendsDemo18
{
	public static void main(String[] args)
	{
		Fu14 f=new Zi14();
		System.out.println(f.num);//这个打印的结果是:5
		
		Zi14 z=new Zi14();
		System.out.println(z.num);//这个打印的结果是:8
	}
}

在多态中,静态成员函数的特点:
无论编译和运行都参考左边

class Fu18
{
	int num=5;
	void method_1()
	{
		System.out.println("Fu method_1");
	}
	void method_2()
	{
		System.out.println("Fu method_2");
	}
	static void method_4()
	{
		System.out.println("Fu method_4");
	}
}
class Zi18 extends Fu18
{
	int num=8;
	void method_1()
	{
		System.out.println("Zi method_1");
	}
	void method_3()
	{
		System.out.println("Zi method_3");
	}
	static void method_4()
	{
		System.out.println("Zi method_4");
	}
}
class ExtendsDemo19
{
	public static void main(String[] args)
	{
		Fu18 f=new Zi18();
		f.method_4();//运行结果是:"Fu method_4"
	}
}
需求:数据库的操作
数据是:用户信息
1、连接数据库 JDBC Hibernate

2、操作数据库
      增删改查
      c create r read u update d delete
    
3、关闭数据库连接
  class UserInfoByIDBC
  {
  public void add(User user)
  {
  1、连接数据库
2、使用sql添加语句添加数据
3、关闭连接
}
public void delete(User user)
{
1、连接数据库
2、使用sql添加语句删除数据
3、关闭连接
}
}


Object类中已经提供了对对象是否相同的比较方法

如果自定义类中也有比较相同的功能,没有必要重新定义,只要沿袭父类中的功能,建立自己特有的比较内容即可。这就是覆盖。

class Demo14
{
	private int num;
	Demo14(int num)
	{
		this.num=num;
	}
	public boolean equals(Object obj)//Object obj=new Demo();父类引用指向了子类对象,所以要将父类向下转型再比较.
	                                 //equals是Object类中的方法,这里是将Object类中的equals方法复写
	{
		Demo14 d=(Demo14)obj;
		return this.num==d.num;
	}
}
class ObjectDemo3
{
	public static void main(String[] args)
	{
		Demo14 d1=new Demo14(4);
		Demo14 d2=new Demo14(4);
		System.out.println(d1.equals(d2));
	}
}


多态面向对象编程中的一个重要概念,它允许不同类型的对象对同一个消息做出不同的响应。基于多态的冲突通常是指在继承关系中存在多个同名方法,导致在调用时产生歧义或冲突的情况。 在黑马程序员的教学中,关于基于多态的冲突一般会涉及到两种情况: 1. 方法重载冲突:方法重载是指在同一个类中存在多个同名方法,但它们的参数类型和/或个数不同。当我们调用这个方法时,编译器会根据参数类型选择最合适的方法。但如果存在多个方法都符合调用要求,就会产生冲突。这种情况下,编译器无法确定到底应该调用哪个方法,会报错。 2. 方法覆盖冲突:方法覆盖是指子类重写了父类中的同名方法。当我们通过父类的引用调用这个方法时,实际执行的是子类中重写的方法。但如果存在多个子类同时重写了这个方法,并且我们使用父类引用指向不同的子类对象,就会产生冲突。这种情况下,编译器同样无法确定到底应该调用哪个方法,会报错。 为了解决基于多态的冲突,我们可以采取以下方法: 1. 方法重载冲突:避免在同一个类中定义多个同名方法,或者通过修改参数类型和/或个数来消除冲突。 2. 方法覆盖冲突:使用强制类型转换或者将父类引用指向具体的子类对象,明确调用具体的重写方法。 在实际开发中,我们需要注意避免基于多态的冲突,保持代码的清晰和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值