提问人:Zach Shallbetter 提问时间:12/27/2011 最后编辑:abatishchevZach Shallbetter 更新时间:12/12/2021 访问量:40331
对象与基元
object vs. primitive
问:
最近有一位面试官要求定义对象和基元之间的区别。考虑到所有语言都以原始语开头,这似乎是一个奇怪的问题。你会如何回答这个问题?
我还应该指出,这次面试是针对前端开发职位的,所以他所指的语言(我假设)是 JavaScript。
答:
基元是一种数据类型,它不包含其他数据类型,并且无法进一步分解。它就像编程场景中的原子。我说原子是因为原子是物质的基本单位,没有任何东西可以从中推导出来。
我的意思是,C 中的数据类型不能分解为更小的数据类型。另一方面,一个物体可以被认为是一个分子,由不止一种原始类型组成。例如,作为 C++ 标准库的一部分;但是,它是一个对象,它内部由较小的数据类型组成,并包含方法。int
string
需要注意的是,并非所有面向对象的语言都是基于类的(例如。Javascript)你不能在Javascript中定义一个类,所以这里的对象是完全不同的。尽管 Javascript 中的所有内容都是一个对象(Ruby 也是如此),但 Number 对象实际上是内部原语的包装器。
评论
从 Java 的角度来看:
- 基元不由其他数据类型组成。作为对象的位置 可以而且通常是。
- 基元是按值传递的,即基元本身的副本 已通过。而对于对象,引用的副本被传递, 而不是对象本身。
- 基元是独立的数据类型,即不存在 层次结构/超类。而每个对象都是类的后代 “对象”。
- 每个对象本身都有一些默认方法,它继承这些方法 从类 Object(例如 toString()、clone()、wait()、notify()、 notifyAll() 等)。基元没有任何方法 与自己相关联。
- 基元是不可变的,它们可以在没有任何特殊的情况下使用 关心。而对于物体,需要特别小心,它们是 默认情况下不可变。
- 对于对象,有两种类型的副本:浅副本和深副本。那里 是它们之间的显着差异。所以选择取决于 我们打算如何使用它们。对于原语,没有这样的 不同,默认情况下,一切都只是深拷贝。
我认为原始不能再像int,string(例如内置数据类型)那样划分 . 另一方面,对象可以分成小块,如数组、结构。
我只是一个学生,这是我的意见。
如果你认为我的答案是错误的,你可以纠正我。
谢谢
让我们想象一下实际的差异。
原
1) 基元数据类型使用少量内存来表示单个数据项。相同基元类型的所有数据大小相同。
例如: 基元类型 int 表示使用 32 位的整数。int 类型的所有变量都使用 32 位。
2)Java中只有八种原始数据类型:byte、short、int、long、float、double、char和boolean。Java 程序不能定义任何其他基元数据类型。
对象
对象是一大块内存,可能包含大量数据以及处理该数据的方法(小程序)。Java 标配了数以千计的对象类,程序员可以轻松创建其他类。(虽然有数千个标准课程,但对于这门课程,您只需要熟悉十几个课程。
在 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
}
评论