时间:2010-07-24 00:44:40

标签: oop

18 个答案:

答案 0 :(得分:120)

答案 1 :(得分:36)

事实上,面向对象编程经常通过在开发的哲学方面和计算机的实际机械工作之间建立脱节而产生混淆。我会尝试将这两者对比起来:

OOP的基本概念是:Class>>对象>>实例

班级=蓝图。 对象是基于“蓝图”(如房子)构建的实际内容。 实例是对象的虚拟副本(但不是真实副本)。

“实例”的更多技术解释是它是“内存引用”或引用变量。这意味着'实例'是内存中的变量,具有其中对象的内存地址。它所对应的对象是该实例被称为“实例”的同一对象。如果你有一个对象的很多实例,你真的只有很多变量在你的内存中的不同位置,它们都有相同的确切内存地址 - 这是同一个确切对象的所有地址。你不能“改变”一个实例,尽管你的代码看起来很像。当您“更改”实例时,您真正要做的是直接更改原始对象。在电子方面,处理器在更改原始对象的数据之前经历内存中的一个额外位置(引用变量/实例)。

该过程是:处理器>>实例的内存位置>>原始对象的内存位置。

请注意,使用哪个实例并不重要 - 最终结果将始终相同。所有实例将继续在其内存位置(对象的内存地址)中保持相同的确切信息,并且只有对象会发生变化。

类和对象之间的关系有点混乱,虽然在哲学上它最容易理解(蓝图>> house)。如果对象是存储在内存中的实际数据,那么什么是“类”?事实证明,机械上对象是该类的精确副本。因此,类只是内存中其他位置的另一个变量,它保存与对象相同的确切信息。注意关系之间的区别:

Object是该类的副本。 Instance是一个保存对象内存地址的变量。

您还可以拥有同一个类的多个对象,然后是每个对象的多个实例。在这些情况下,每个对象的实例集在值上是等价的,但对象之间的实例不是。例如:

让A级 从A类开始,让Object1,Object2和Object3。

// Object1与object2和object3具有相同的确切值,但它们位于内存中的不同位置。

来自Object1>>让obj1_Instance1,obj1_Instace2,obj1_Instance3

//所有这些实例在值和内存中的不同位置也是等价的。他们的值= Object1.MemoryAddress。

当你开始介绍类型时,事情变得更加混乱。以下是使用c#中的类型的示例:

//假设类Person存在 人约翰=新人();

实际上,如果将代码拆分为两部分,则此代码更易于分析:

Person john;
john = new Person();

在技术方面,第一行'声明 type Person的变量。但是,这是什么意思??一般的解释是我现在有一个只能容纳Person对象的空变量。但等一下 - 它是一个空变量!变量内存位置没有任何内容。事实证明,“类型”在机械上毫无意义。类型最初是作为一种管理数据的方式而发明的。即使你声明了原始类型,如int,str,chr(没有初始化它),计算机内也没有任何事情发生。这种奇怪的编程语法方面是人们认为类是对象蓝图的一部分。对于具有委托类型,事件处理程序等的类型,OOP变得更加混乱。我不会过多地关注它们,只记得它们都是用词不当。在变量成为对象或设置为对象的内存地址之前,变量不会发生任何变化。

第二行也有点令人困惑,因为它同时做了两件事:

首先评估右侧“新人()”。它创建了Person类的新副本 - 也就是说,它创建了一个新对象。

然后评估左侧“john =”。它将john转换为引用变量,为它提供刚刚在同一行右侧创建的对象的内存地址。

如果你想成为一名优秀的开发者,重要的是要理解没有任何计算机环境能够以哲学理想为基础。计算机甚至不合逻辑 - 它们实际上只是使用基本布尔电路(主要是NAND和OR)粘合在一起的大量电线。

答案 2 :(得分:24)

单词 Class 来自分类 A 类别,其中包含某些内容),现在我们有了所有人都听说 Class 就像一张蓝图,但这究竟意味着什么呢?这意味着包含特定类别的描述,(我希望通过使用Java的示例显示类,对象和实例之间的区别,我会请求读者将其可视化就像读故事时的故事一样,如果你不熟悉java并不重要那么我们首先要创建一个名为 HumanBeing 类别 ,所以Java程序将表达如下

class HumanBeing{ 
   /*We will slowly build this category*/ 
}

现在 HumanBeing 具有哪些属性名称年龄高度重量现在让我们将自己限制为这四个属性,让我们将其添加到我们的类别

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight; 

   /*We still need to add methods*/

}

现在每个类别都有一个行为,例如类别具有吠叫,抓取,滚动等行为......同样,我们的类别 HumanBeing 也可以有某些行为例如,当我们询问 HumanBeing 你的名字/年龄/体重/身高是多少?它应该给我们它的名字/年龄/重量/高度,所以在java中我们按如下方式进行

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight;  

    public HumanBeing(String Name,int Age,float Height,float Weight){
       this.Name = Name;
       this.Age  = Age;
       this.Height = Height;
       this.Weight = Weight;
    }

    public String getName(){
      return this.Name;
    }

    public int getAge(){
      return this.age;
    }

    public float getHeight(){
      return this.Height;
    }

    public float getWeight(){
      return this.Weight;
    }
}

现在我们已经在 HumanBeing 类别中添加了行为,因此我们可以询问其名称,年龄,身高,体重,但是您会向谁询问这些详细信息,因为class HumanBeing只是一个类别,它是一个蓝图,例如建筑师在他想要建造的建筑物的纸上制作蓝图,现在我们不能继续在蓝图中生活(它对建筑物的描述)我们可以一旦它建成,只住在建筑物里 所以在这里我们需要从我们上面描述的类别中创建一个人类,那么我们如何在Java中做到这一点

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);    
  }
}

现在在上面的例子中,我们创建了第一个名字年龄身高的人,那么上面的代码究竟发生了什么? 。我们实例化我们的类别 HumanBeing ,即创建了我们类的对象

  

注意: 对象和实例不是同义词在某些情况下,似乎对象和实例是同义词,但它们不是,我会同时给出两种情况

案例1:对象和实例似乎是同义词
让我详细说一下,当我们说<{1}} 我们类别的对象是在堆内存上创建的,并且有一些地址被分配给它,{{ 1}}拥有对该地址的引用,现在这个Object是 HumanBeing的对象,还有 HumanBeing的实例。 在这里,对象和实例似乎是同义词,我会重复自己,他们不是同义词

让我们继续我们的故事,我们创造了我们的第一个人类,现在我们可以问他的名字,年龄,身高,体重,这就是我们用Java做的事情

HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);

所以我们有第一个人类,让我们通过给予我们的第一个人类一些资格来移动羽毛,让他们成为医生,所以我们需要一个名为医生的类别并给我们的医生一些行为,所以在java中我们做如下

firstHuman

这里我们使用了继承的概念,它在代码中带来了一些可重用性,Every Doctor将永远是HumanBeing,所以A Doctor将拥有Name,Age,Weight,Height继承HumanBeing而不是再写一遍,请注意我们刚刚写了一篇我们尚未创建的医生的描述,所以让我们在class Birth{ public static void main(String [] args){ HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90); System.out.println(firstHuman.getName()); System.out.println(firstHuman.getAge()); ... ... } }

中创建一名医生
class Doctor extends HumanBeing{
   public Doctor(String Name,int Age,float Height,float Weight){
      super(Name,Age,Height,Weight);
   }
   public void doOperation(){
    /* Do some Operation*/ 
   }

   public void doConsultation(){
    /* Do so Consultation*/
   }
}  

案例2:对象和实例不是同义词
在上面的代码中,我们可以看到我们实例化我们的类别Doctor并将其变为现实即我们只是创建一个对象类别Doctor ,我们已经知道了< strong>在堆内存上创建对象,class Birth在堆上保存对该对象的引用;

此特定对象class Birth{ public static void main(String [] args){ Doctor firstDoctor = new Doctor("Strange",40,6,80); ....... ....... /*Assume some method calls , use of behaviour*/ ....... ....... } } 如下(请注意firstDoctor包含对象的引用,它不是对象本身)

  1. firstDoctor firstDoctor的对象 A的实例firstDoctor
  2. class Doctor 不是class Doctor 的对象,但是 firstDoctor的实例
  3. 因此,特定的Object可以是特定类的实例,但它不必是该给定类的对象

    <强>结论:

      

    如果对象满足特定类别的所有特征,则称该对象是特定类别的实例

    现实世界的例子将如下,我们首先作为人类出生,所以我们将我们视为人类的对象,现在当我们成长时,我们承担责任,学习新技能并在生活中扮演不同角色的例子儿子,兄弟,一个女儿,父亲,母亲现在我们实际上是什么?我们可以说我们是人类的对象,但兄弟,女儿,......等实例

    我希望这会有所帮助

    谢谢

答案 3 :(得分:13)

答案 4 :(得分:5)

答案 5 :(得分:5)

答案 6 :(得分:2)

“一个类描述了一组称为其实例的对象。” - 施乐学习研究小组,“The Smalltalk-80系统”,Byte Magazine第06卷第08期,第39页,1981年。

答案 7 :(得分:1)

答案 8 :(得分:1)

我想最好的答案已经放弃了。

类是蓝图,对象是建筑物或者蓝图的例子对我来说也是如此。

有时候,我想认为类是模板(比如在MS Word中),而对象是使用模板的文档。

答案 9 :(得分:1)

什么是对象?

对象是类的实例。通过找到您周围的真实世界示例,可以最好地理解对象。你的桌子,你的笔记本电脑,你的车都是一个很好的现实世界的例子。

真实世界对象共享两个特征,它们都具有状态和行为。人类也是一个对象的好例子。我们人类有状态/属性 - 名字,身高,体重和行为 - 走路,跑步,说话,睡觉,代码:P。

什么是班级?

类是描述对象详细信息的蓝图或模板。这些细节是即

名 属性/状态 操作/方法

class Car 
{
    int speed = 0;
    int gear = 1;

    void changeGear(int newGear)
    {
        gear = newGear;
    }

    void speedUp(int increment) 
    {
        speed = speed + increment;
    }

    void applyBrakes(int decrement) 
    {
        speed = speed - decrement;
    }
}

考虑上面的示例,字段speedgear将代表对象的状态,方法changeGearspeedUpapplyBrakes定义Car对象与外界的行为。

参考文献:

答案 10 :(得分:0)

面向对象编程是一个system metaphor,它可以帮助您组织程序需要处理的知识,使您可以更轻松地开发程序。当你选择使用OOP进行编程时,你会选择你的OOP-Googles,并且你决定通过发送消息来看到真实世界的问题,因为许多对象在它们之间进行协作。而不是看到盖伊驾驶汽车,你会看到一个盖伊向汽车发送信息,表明他想要汽车做什么。汽车是一个很大的对象,它将通过向它的引擎或它的轮子发送消息来响应该消息,以便能够正确响应驾驶员告诉他在消息中做的事情等等。

在您创建了系统隐喻之后,您将所有现实视为发送消息的对象,您决定将所有与您的问题域相关的内容放在PC中。在那里你注意到有很多人驾驶不同的卡,并且分别编程每个人的行为是毫无意义的,因为他们都以相同的方式行事......所以你可以说两件事:

  • 所有这些人的行为都是一样的,所以我会创建一个名为的类 驱动程序将指定世界上所有驱动程序的行为, 因为他们都以同样的方式行事。 (而你正在使用基于类的OOP)
  • 或者你可以说嘿!第二个驱动程序的行为与第一个驱动程序的行为相同,只是他喜欢更快一点。并且第三个驱动程序的行为方式与第一个驱动程序的行为相同,除非他喜欢在驾驶时锯齿形。 (并且您使用基于原型的OOP)。

然后你开始在计算机中输入所有驱动程序的行为信息(或者第一个驱动程序的行为方式,以及第二个和第三个驱动程序与该驱动程序的不同之处),并在一段时间后获得程序,然后使用用于创建三个驱动程序的代码,这些驱动程序是您在PC中使用的模型,用于提供给您在现实世界中看到的驱动程序。你在PC中创建的那3个驱动程序是原型的实例(实际上第一个是原型,第一个可能是原型,取决于你如何建模)或你创建的类。 实例和对象之间的区别在于对象是您在现实世界中使用的隐喻。你选择将这个人和汽车视为对象(将你看作是实例,这是不正确的)在他们之间进行协作。然后,您将其用作创建代码的灵感。在您创建原型或类之后,该实例仅存在于您的程序中。 “对象”存在于PC外部,因为它用于将现实世界与程序结合在一起的映射。它将Guy与您在PC中创建的Driver实例联合起来。所以对象和实例是非常相关的,但它们并不完全相同(一个实例是程序中对象的“腿”,另一个“腿”在现实世界中)。

答案 11 :(得分:0)

答案 12 :(得分:0)

答案 13 :(得分:0)

在此主题中扩展前面给出的一个示例......

考虑一个场景 - 需要在附近建造5栋房屋用于住宅用途。所有5栋房屋都拥有共同的建筑结构。 构造体系结构是 。 House是 对象 。 每个住在其中的人都是 实例

答案 14 :(得分:0)

答案 15 :(得分:-2)

对象:当我们创建一个对象时,该对象占用了一些内存 例如:测试t = new Test(); //这里t是Test class的对象

实例:当我们声明实例时,单独的内存不被该实例占用 例如:测试t; //这里是测试类的实例

答案 16 :(得分:-2)

简单地说,对象是唯一不分配内存的声明。 和instance是分配内存的类的对象。

答案 17 :(得分:-3)

对我来说,对象与实例之间存在细微差别

喜欢:

class1 obj;

这里,obj是class1的一个实例,占用了堆栈内存

class1 obj = new class1();

在这种情况下,obj是class1的一个对象并占用堆内存