OOP: 理解类和对象

原创 2004年07月05日 19:55:00
Thursday, September 6 2001 2:30 PM

上一次在"使用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,使得程序的维护更容易.

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

 

面向对象是什么鬼(OOP)

什么是面向对象我们知道现代的编程方式基本上都是面向对象了,那么面向对象是什么鬼,面向对象跟面向过程有什么不一样? 面向对象编程(英文Object Oriented Programming),所以也叫...
  • q932104843
  • q932104843
  • 2016年08月24日 11:09
  • 546

面向对象(oop)与面向过程(opp)的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某...
  • Edward_Wong
  • Edward_Wong
  • 2014年09月24日 23:50
  • 2743

OOP(面向对象面试题)

OOP(面向对象) 1:说出一些常用的类,包,接口,请各举5个 常用的类:BufferedReader  BufferedWriter  FileReader  FileWirter  Strin...
  • nysyxxg
  • nysyxxg
  • 2013年04月08日 20:32
  • 3247

OOP 面向对象编程

面向对象 对象的概念是面向对象技术的核心。在现实世界里,我们面对的所有事物都是对象,如计算机、电视机、自行车等。在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世...
  • php_1314
  • php_1314
  • 2015年06月16日 16:20
  • 751

Python 进阶_OOP 面向对象编程_组合与继承

目录 目录 前言 组合 派生 前言 我们定义一个类是希望能够把类当成模块来使用, 并把类嵌入到我们的应用代码中, 和其他的数据类型/逻辑执行流结合使用. 一般来说我们可以使用两种...
  • Jmilk
  • Jmilk
  • 2016年11月06日 13:14
  • 2360

针对Android的重新认识OOP(上)

重新认识OOP几个字尾的基本概念“-Oriented”含义 “-Oriented”翻译,导向的,定向的 “Object-oriented”相信所有程序都是由对象构成的 综上,开发时,写代码,心中需要有...
  • Goo_x
  • Goo_x
  • 2016年02月16日 00:18
  • 1470

OOP(1) 为什么要用面向对象编程,它的优点是什么?

说在前面的话身边总能听到有人问这样的问题:学编程哪一种语言比较好? 我觉得在挑选一门语言进行学习之前,你需要做的一件事情就是打开一本介绍这门语言的书,看看他的前言,里边会告诉你这个语言到底是做什么的...
  • huiyuanliyan
  • huiyuanliyan
  • 2016年06月21日 11:37
  • 3035

OOP和MVC区别

一个思想                                                        一个模式 (模式是凌驾于面向对象之上的一种存在) OOP是面向对象编程    ...
  • sinat_37212928
  • sinat_37212928
  • 2017年06月06日 09:10
  • 446

php面向对象(OOP)编程

大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方法。构 造函数的声明与其它操作的声明一样,只是其名称必须是__...
  • qq_37674858
  • qq_37674858
  • 2017年12月28日 12:08
  • 36

java 类和对象的理解

对象和类的定义 重载 class father { public void get() { System.out.println("father"); } } ...
  • qq_26296197
  • qq_26296197
  • 2016年09月01日 08:08
  • 1325
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OOP: 理解类和对象
举报原因:
原因补充:

(最多只允许输入30个字)