分享
 
 
 

面向对象思想之 -- 理解类和对象

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

上一次在"使用Java开始面向对象的编程"这篇文章中,我们学习了一个编程语言要真正成为面向对象的,它应该支持信息隐藏/封装,多态,继续和动态绑定.另外,我们知道了Java完全支持这些功能,而且知道了因为Java是一种解释性的语言并运行在虚拟机的内部,所以由Java写成的任何程序都可以在任何支持 Java虚拟机(JVM)的操作系统上运行.我们还明白了对象是代表现实生活中事物的软件-编程模型以及对象是由它们的状态和行为定义的.最后,我们知道了Java中除了原始数据对象以外一切都是对象.

因为这种程序设计风格中的这许多内容都和对象以及类有关,我们将在下面进一步的考察它们.

对象详论

使用对象的一个要害是当你在浏览系统分析文档或者设计文档的时候如何来确定它们.因为对象一般代表人,地方或者事物,所以一个确定对象的基本的方法就是找出句子中所使用的名词.这里有一个简单的例子.在句子"一个顾客可以拥有多于一个的银行帐号",我们就确定了两个对象,客户和帐号.在句子"小猫喵喵叫"中,我们能够确定一个对象,猫.

类详论

前面,我们学习了一个类是定义了对象如何动作以及当对象创建或者说实例化的时候应该包含些什么的实体.在对动物的讨论中,我们可以说,"狗儿汪汪叫,猫喵喵叫,鸭子嘎嘎叫."确定句子中的对象我们就得到了狗,猫和鸭子.至于汪汪叫,喵喵叫,嘎嘎叫,那都是我们对象发出的行为动作.

要实现这些对象,我们需要创建三个对象分别叫Dog,Cat和DUCk.要实现它们的行为,我们可以为每一个这些对象创建代表每个对象发出的声音的方法,而且我们把这个方法叫做speak或者,假如我们发挥想象力的话还可以把这个方法叫做sayHello.

在程序的上下文中为了演示这些概念,让我们修改上篇文章中的HelloWorld程序,添加这三个新对象并给它们中的每一个添加sayHello方法,如下所示:

public class HelloWorld

{

public static void main(String[] args)

{

Dog animal1 = new Dog();

Cat animal2 = new Cat();

Duck animal3 = new Duck();

animal1.sayHello();

animal2.sayHello();

animal3.sayHello();

}

}

class Dog

{

public void sayHello()

{

System.out.println("Bark");

}

}

class Cat

{

public void sayHello()

{

System.out.println("Meow");

}

}

class Duck

{

public void sayHello()

{

System.out.println("Quack");

}

}

在编译并运行了这个程序以后,输出应该如下:

Bark

Meow

Quack

看看我们的程序,我们马上就注重到了一些事情:每个对象代表了一种动物,而每个对象实现了一个相同的方法,sayHello.假设我们想要给对象更多的功能以及用来代表对象所指的动物的方法和属性.比方说,我们可以添加一个方法来确定一个动物是不是哺乳类的,或者我们添加一个方法来确定一个动物是不是肉食性的.我们可以通过给每一个对象添加这两种方法来实现或者我们也能够使用OOP的两个最强大的功能:继续和多态.

因为所有的对象都代表一个对象,所以我们将创建一个被称为"基类"或是"超类"的类,它的名字是Animal.我们然后可以让我们的对象从Animal类继续相同的特点并强制每个对象只实现与Animal类不同的功能.

Java用extends要害字指明一个类从另一个继续.让我们利用继续和多态的概念获得代码重用的好处来重建我们的程序并使得每个对象只实现与基类Animal不同的功能:

public class HelloWorld

{

public static void main(String[] args)

{

Dog animal1 = new Dog();

Cat animal2 = new Cat();

Duck animal3 = new Duck();

System.out.println("A dog says " +animal1.getHello()

+", is carnivorous: " +animal1.isCarnivorous()

+", is a mammal: " +animal1.isAMammal());

System.out.println("A cat says " +animal2.getHello()

+", is carnivorous: " +animal2.isCarnivorous()

+", is a mammal: " +animal2.isAMammal());

System.out.println("A duck says " +animal3.getHello()

+", is carnivorous: " +animal3.isCarnivorous()

+", is a mammal: " +animal3.isAMammal());

}

}

abstract class Animal

{

public boolean isAMammal()

{

return(true);

}

public boolean isCarnivorous()

{

return(true);

}

abstract public String getHello();

}

class Dog extends Animal

{

public String getHello()

{

return("Bark");

}

}

class Cat extends Animal

{

public String getHello()

{

return("Meow");

}

}

class Duck extends Animal

{

public boolean isAMammal()

{

return(false);

}

public boolean isCarnivorous()

{

return(false);

}

public String getHello()

{

return("Quack");

}

}

在编译并运行我们的程序以后,输出应该如下:

A dog says Bark, is carnivorous: true, is a mammal: true

A cat says Meow, is carnivorous: true, is a mammal: true

A duck says Quack, is carnivorous: false, is a mammal: false

看看我们的例子,你将发现我们定义了一个叫做Animal的新类,它定义了三个方法:isAMammal, isCarnivorous, 和 getHello.你一概还注重到了,我们在每个现存的类申明的前面都添加了extends Animal这个语句.这个语句告诉编译器这些对象是Animal类的子类.

因为方法isAMammal 和 isCarnivorous 都返回 true,所以Dog和Cat类用不着重新实现--即"重载"这两个方法.但是鸭子既不是哺乳动物又不是肉食性的,所以Duck类需要重载这两种方法来返回正确的值.我们所有的对象都以自己独特的方式说"hello",所以它们都需要重载getHello方法.因为每种动物说"hello"的方式都不同,所以我们在基类中将getHello方法申明为抽象的,而且我们没有给这个方法一个函数体.这就迫使Animal的每一个子类重载getHello方法并根据每一个特定动物的需要来定义它.

因为我们将getHello方法申明为虚拟的,我们就不能直接实例化Animal对象.因此,我们需要将Animal类也申明为抽象的.我们通过在Animal类定义的开始行添加abstract要害字来实现这一点.子类重载它们基类的方法的能力就是多态.多态使得子类能够使用基类的方法或是在这些方法不足的时候重载它们.这就实现了代码重用,加快了代码的实现过程,而且它还隔离和程序中的bug,使得程序的维护更轻易.

总结

在本文中,我们学习了如何确定潜在的对象.我们还学习了如何使用继续和多态来加快我们的代码实现过程并隔离错误,这使得代码的维护过程更加轻易.下一次,我们将展开讨论多态和继续的概念并开始我们对动态绑定的讨论.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有