【问题标题】:object vs. primitive对象与原始
【发布时间】:2012-01-28 10:05:15
【问题描述】:

最近有一位面试官要求定义对象和原语之间的区别。考虑到所有语言都以原语开头,这似乎是一个奇怪的问题。你会如何回答这个问题?

我还应该指出,这次面试是针对前端开发职位的,所以他所指的语言(我假设)是 JavaScript。

【问题讨论】:

  • 您提到您假设面试官指的是 JavaScript。我认为你应该问他只是为了确定——当一个简单的问题就能澄清这一点时,猜测他在问什么是没有意义的。
  • 好建议,确定他的目标会有所帮助。

标签: javascript oop object primitive


【解决方案1】:

原语是一种数据类型,它不包含其他数据类型,不能进一步细分。它就像编程场景中的原子。我说原子是因为原子是物质的基本单位,没有任何东西可以从中派生出来。

我的意思是,C 中的int 不能分解为更小的数据类型。另一方面,一个对象可以被认为是一个分子,由多个原始类型组成。例如,string 是 C++ 标准库的一部分;但是,它是一个对象,内部由较小的数据类型组成并包含方法。

重要的是要注意,并非所有面向对象的语言都是基于类的(例如 Javascript) 您不能在 Javascript 中定义类,因此这里的对象完全不同。尽管 Javascript 中的一切都是对象(Ruby 也是),但 Number 对象实际上是内部原语的包装器。

【讨论】:

  • 不妨指出,因为 es6 类也可以在 JavaScript 中定义。
  • es6 类只是语法糖:在底层,它们创建类的方式与我们在 es6 之前所做的相同。即基于原型的类。这使它们与大多数语言的课程不同。这种差异重要吗?也许在面试中比在现实生活中更频繁:)developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

Java 的角度来看:

  1. 原语不由其他数据类型组成。哪里作为一个对象 可以而且通常是。
  2. 基元按值传递,即基元本身的副本 已通过。而对于对象,引用的副本被传递, 而不是对象本身。
  3. 原语是独立的数据类型,即不存在 他们的层次结构/超类。而每个对象都是类的后代 “对象”。
  4. 每个对象都有自己的一些默认方法,它继承了这些方法 来自类 Object(例如 toString()、clone()、wait()、notify()、 notifyAll() 等)。原语没有任何方法 与自己相关联。
  5. 原语是不可变的,它们可以按原样使用,无需任何特殊 关心。而对于物体,需要特别小心,它们是 默认情况下不是不可变的。
  6. 对于对象,有两种类型的副本,浅层和深层。那里 是它们之间的显着差异。所以选择取决于 我们打算如何使用它们。对于原语,没有这样的 不同的是,默认情况下,所有内容都只是深拷贝。

【讨论】:

    【解决方案3】:

    我认为primitive不能再像int、string那样划分(比如内置数据类型) . 另一方面,对象可以分成数组、结构等小块。

    我只是一名学生,这是我的看法。
    如果您认为我的回答有误,您可以纠正我。
    谢谢

    【讨论】:

      【解决方案4】:

      让我们可视化实际差异。

      原语

      1) 原始数据类型使用少量内存来表示单个数据项。相同基本类型的所有数据大小相同。

      例如: 原始类型 int 表示使用 32 位的整数。所有 int 类型的变量都使用 32 位。

      2) Java 中只有八种原始数据类型:byte、short、int、long、float、double、char 和 boolean。 Java 程序不能定义任何其他原始数据类型。

      对象

      对象是一大块内存,可能包含大量数据以及处理这些数据的方法(小程序)。 Java 标准有数千个对象类,程序员可以轻松地创建其他类。 (虽然标准课有上千个,但是这门课你只需要熟悉十几个课就行了。)

      【讨论】:

        【解决方案5】:

        在 Java 中,当您将 k 字段发送到测试方法时,首先将其转换为整数类型。因为原始类型不是 Object 类型的子类型之一。

        public static void main(String[] args) {
            int k=3;
            test(k);
            test2(k);
        }
        
        private static void test(Object k) {
            System.out.print(k.getClass().isPrimitive());//false
        }
        
        private static <T> void test2(T k) {
            System.out.print(k.getClass().isPrimitive());//false
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-02
          • 2019-07-13
          • 2012-07-11
          • 2015-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-09
          相关资源
          最近更新 更多