Java编程基础知识——多态的使用

假设我们不知道有ArrayList这种类而想自行编写维护list的类以保存Dog对象。在之前我们只会写出add()方法。我们使用大小为5的简单Dog数组(Dog[])来保存新加入的Dog对象。当Dog对象超过5个时候,你还是可以调用add()方法,但是什么事情也不会发生。如果没有越界,add()会把Dog装到可用的数组位置中,然后递增可用索引(nextIndex)。
在这里插入图片描述
那么,再让你写一个cat,你怎么办?

  1. 照葫芦画瓢,写一个;
  2. 创建一个单独的类DogandCatList类,用addCat(Cat c)和addDog(Dog d)来同时处理两个不同的数组实例,这也与不好;
  3. 编写一个不同的AnimalList类让它处理Animal所有的子类。这应该是最好的办法,所以我们就这样处理,用更通用的Animal来取代个别的子类。
public class AnimalTestDriver {

	
	
	private Animal[] animal = new Animal[5];
	private int nextIndex = 0;
	
	public void add(Animal an) {
		if(nextIndex<animal.length) {
			animal[nextIndex] = an;
			System.out.println("Dog add at"+ nextIndex);
			nextIndex++;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AnimalTestDriver list  = new AnimalTestDriver();
		list.add(new Dog());
		list.add(new Cat());
	}

}

其实只是把上面的Dog换个Animal而已。

非Animal呢?为什么不写个万用类呢?

你知道这要怎么做。我们可以修改数组的类型,并且调整add()方法的参数,以处理Animal之上的类。那边是更通用、更抽象的一种类。但是真的有这种类么?我们设计Animal并没有父类啊?
事实上是有的。
还记得ArrayList的方法么?他们是通过对象这个类型来操作所有类型的对象。
在Java中的所有类都是从Object这个类继承出来的。
它是所有类的源头,是所有类的父类。
如果Java中没有共同的父类,那将无法让Java的开发人员创建出可以处理自定义类型的类,也就是说无法写出想ArrayList这样可以处理各种类的类。
就算你不知道,但实际上所有的类都是从对象给继承出来的。你可以把自己写的类想象成是这样声明出来的:
public class Dog extends Object{}
但是Dog本来就是从Canine给extends出来的啊 !
没有关系,编译器会知道改成让Canine去继承对象。事实上是Animal去继承对象。
在这里插入图片描述
没有直接继承过其他类的类会是隐含的继承对象
所以就算Dog或者Canine没有直接extends对象,还是会通过Animal来继承对象。

终极对象有什么?

如果你是Java,那你会想要让每个对象都带有什么行为?来个判断相等的方法如何?
我们列出来其中的一部分方法:
equals()
hashCode()
getClass()
toString()
·····
对此,你或许会有这样的疑问:

  1. Object这个类是抽象类么?
    不是。至少不是正式的Java抽象类。因为它可以被所有类继承下来的方法都实现程序代码,所以没有必须被覆盖过的方法。
  2. 那么是不是可以覆盖过Object的方法?
    部分可以。但是有些被标记为final,这代表你不能覆盖掉他们。强烈建议你用自己写的类去覆盖掉equals、toString等待。
  3. Object类是具体类。怎么会允许人去创建Object的对象呢?这不就是和Animal对象一样不合理么?
    因为有的时候你就是会需要一个通用的对象,一个轻量化的对象。它最常见的用途是用在线程的同步化上面(以后再说)。
  4. 所以Object的主要目的是提供多态的参数与返回类型么?
    这个Object类有两个主要的目的:作为多态让方法可以应付多种类型的机制,以及提供Java在执行期对任何对象都有需要的方法的实现程序代码(让所有的类都会继承到)。有一部分是和线程有关。
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值