黑马程序员----[20150428][面向对象4]

本文深入解析Java中的多态概念,包括多态的定义、扩展性、好处与弊端,以及多态在转型、示例、成员特点、主板示例、扩展示例等方面的应用,并详细介绍了Object类中的equals()与toString()方法。文章还通过实例讲解了多态在实际编程中的作用,以及如何在Java中实现多态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------   Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

第四讲  面向对象4--多态

1.多态-概念

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

人:男人,女人
动物:猫,狗。

猫 x = new 猫();
动物 x = new 猫();

2.多态-扩展性

Animal c = new Cat();      //一个对象可以有多种形态。动物可以是猫,狗,猪。。。
c.eat();

public static void function(Animal a)                 //Animal a = new Cat();
	{
		a.eat();
		//a.catchMouse();
	}
	/*
	public static void function(Cat c)//
	{
		c.eat();
	}
	public static void function(Dog d)
	{
		d.eat();
	}

	public static void function(Pig p)
	{
		p.eat();
	}
	*/
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。

3.多态-转型

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

//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用。转成子类类型。向下转型。
Cat c = (Cat)a;
c.catchMouse();

//千万不要出现这样的操作,就是将父类对象转成子类类型。
//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
//多态自始至终都是子类对象在做着变化。
Animal a = new Animal();
Cat c = (Cat)a;

4.多态-示例

/*
基础班学生:
	学习,睡觉。
高级班学生:
	学习,睡觉。
可以将这两类事物进行抽取。
*/

abstract class Student{
	public abstract void study();
	public void sleep(){
		System.out.println("躺着睡");
	}
}

class BaseStudent extends Student{
	public void study(){
		System.out.println("base study");
	}
	public void sleep(){
		 System.out.println("坐着睡");
	}
}

class AdvStudent extends Student{
	public void study(){
		System.out.println(" adv study");
	}
}
<pre name="code" class="java">class DoStudent{	
	public void doSome(Student stu){
		stu.study();
		stu.sleep();
	}	
}

 
   
class  DuoTaiDemo3{
	public static void main(String[] args) {
		DoStudent ds = new DoStudent();
		ds.doSome(new BaseStudent());
		ds.doSome(new AdvStudent());
		
//		BaseStudent bs = new BaseStudent();
//		bs.study();
//		bs.sleep();
//		AdvStudent as = new AdvStudent();
//		as.study();
//		as.sleep();
	}
}

5.多态中成员的特点

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

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

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

6.多态的主板示例

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

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");
		method();
	}	
}
class SoundCard implements PCI{
	public void open(){
		System.out.println("SoundCard open");
	}
	public void close(){
		System.out.println("SoundCard close");
	}
}
/*
class MainBoard
{
	public void run()
	{
		System.out.println("mainboard run");
	}
	public void useNetCard(NetCard c)
	{
		c.open();
		c.close();
	}
}

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

class DuoTaiDemo5 {
	public static void main(String[] args) {
		MainBoard mb = new MainBoard();
		mb.run();
		mb.usePCI(null);
		mb.usePCI(new NetCard());
		mb.usePCI(new SoundCard());	
	}
}
上边的例子要重点掌握,用到了接口,多态,增加了多态的扩展性。注释中是最初的设计方案,但是是死程序,不支持扩展。

7.多态的扩展示例

/*
需求:数据库的操作。
数据是:用户信息。
1,连接数据库。JDBC  Hibernate
2,操作数据库。
	c create r read  u update  d delete
3,关闭数据库连接。
*/
interface UserInfoDao{                          //降低耦合,接口的好处
	public void add(User user);
	public void delete(User user);
}
class UserInfoByJDBC implements UserInofDao{
	public void add(User user){
		1,JDBC连接数据库。;
		2,使用sql添加语句添加数据。;
		3,关闭连接。
	}
	public void delete(User user){
		1,JDBC连接数据库。;
		2,使用sql添加语句删除数据。;
		3,关闭连接。
	}
}

class UserInfoByHibernate implements UserInfoDao{
	public void add(User user){
		1,Hibernate连接数据库。;
		2,使用sql添加语句添加数据。;
		3,关闭连接。
	}
	public void delete(User user){
		1,Hibernate连接数据库。;
		2,使用sql添加语句删除数据。;
		3,关闭连接。
	}
}

class  DBOperate{
	public static void main(String[] args) {
		//UserInfoByJDBC ui = new UserInfoByJDBC();
<span style="white-space:pre">		</span>//UserInfoByHibernate ui = new UserInfoByHibernate();
		UserInfoDao ui = new UserInfoByHibernate();               //多态
		ui.add(user);
		ui.delete(user);
	}
}

8.Object类-equals()

Object:是所有对象的直接后者间接父类,传说中的上帝。
该类中定义的肯定是所有对象都具备的功能。

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

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

9.Object类-toString()

java认为所有对象都能变成字符串被打印。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值