对象与基元

object vs. primitive

提问人:Zach Shallbetter 提问时间:12/27/2011 最后编辑:abatishchevZach Shallbetter 更新时间:12/12/2021 访问量:40331

问:

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

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

JavaScript OOP 对象 原语

评论

3赞 Mansoor Siddiqui 12/28/2011
你提到你假设面试官指的是 JavaScript。我想你应该问他只是为了确定--当一个简单的问题可以澄清这一点时,猜测他在问什么是没有意义的。
1赞 Zach Shallbetter 12/29/2011
好的建议,确定他要做什么会有所帮助。

答:

49赞 Mithun Sasidharan 12/27/2011 #1

基元是一种数据类型,它不包含其他数据类型,并且无法进一步分解。它就像编程场景中的原子。我说原子是因为原子是物质的基本单位,没有任何东西可以从中推导出来。

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

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

评论

1赞 faerin 1/7/2019
可能值得指出的是,由于 es6 类也可以在 JavaScript 中定义。
2赞 Zachary Ryan Smith 9/16/2021
ES6 类只是语法糖:在后台,它们以与 ES6 之前相同的方式创建类。也就是说,基于原型的类。这使它们与大多数语言的类不同。这种差异重要吗?也许在采访中比在现实生活中更频繁:)developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/......
27赞 Bhushan 12/28/2011 #2

Java 的角度来看:

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

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

我只是一个学生,这是我的意见。
如果你认为我的答案是错误的,你可以纠正我。
谢谢

3赞 N.Neupane 12/18/2019 #4

让我们想象一下实际的差异。

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

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

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

对象

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

1赞 bmck 12/12/2021 #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
}