簡體   English   中英

對象與原始

[英]object vs. primitive

最近有一個面試官要求定義對象和基元之間的區別。 考慮到所有語言都以原始語言開頭,這似乎是一個奇怪的問題。 你會如何回答這個問題?

我還應該指出,這次面試是針對前端開發職位的,所以他所指的語言(我假設)是 JavaScript。

原語是一種數據類型,它不由其他數據類型組成,不能進一步分解。 它就像編程場景中的原子。 我說原子是因為原子是物質的基本單位,沒有任何東西可以從它派生出來。

我的意思是,C 中的int不能分解為更小的數據類型。 另一方面,對象可以被認為是由多個原始類型組成的分子。 例如, string是 C++ 標准庫的一部分; 然而,它是一個對象,它在內部由較小的數據類型組成並包含方法。

需要注意的是,並非所有面向對象的語言都是基於類的(例如 Javascript)。您不能在 Javascript 中定義類,因此這里的對象完全不同。 盡管 Javascript 中的一切都是對象(Ruby 也是),但 Number 對象實際上是內部原語的包裝器。

Java 的角度來看:

  1. 原語不由其他數據類型組成。 一個對象可以在哪里並且通常在哪里。
  2. 原語按值傳遞,即傳遞原語本身的副本。 而對於對象,傳遞的是引用的副本,而不是對象本身。
  3. 原語是獨立的數據類型,即它們不存在層次結構/超類。 而每個對象都是“對象”類的后代。
  4. 每個對象都有一些自己的默認方法,這些方法是從類 Object 繼承而來的(例如 toString()、clone()、wait()、notify()、notifyAll() 等)。 原語沒有任何與它們相關聯的方法。
  5. 原語是不可變的,它們可以直接使用而無需任何特別注意。 而對於對象,需要特別注意,默認情況下它們不是不可變的。
  6. 對於對象,有兩種類型的副本,淺副本和深副本。 它們之間存在顯着差異。 所以選擇取決於我們打算如何使用它們。 對於原語,沒有這樣的區別,默認情況下一切都是深拷貝。

我認為primitive不能再像int、string(比如內置數據類型)那樣划分了。 另一方面,對象可以分成小塊,如數組、結構。

我只是一個學生,這是我的意見。
如果您認為我的回答有誤,您可以糾正我。
謝謝

讓我們想象一下實際的差異。

原語

1) 原始數據類型使用少量內存來表示單個數據項。 相同原始類型的所有數據大小相同。

例如:原始類型 int 使用 32 位表示整數。 所有 int 類型的變量都使用 32 位。

2)Java中只有八種原始數據類型:byte、short、int、long、float、double、char和boolean。 Java 程序不能定義任何其他原始數據類型。

對象

對象是一大塊內存,可能包含大量數據以及處理該數據的方法(小程序)。 Java 標配了數千個對象類,程序員可以輕松創建其他類。 (雖然有成千上萬的標准課程,但對於本課程,您只需要熟悉十幾個課程即可。)

在 Java 中,當您將 k 字段發送到測試方法時,首先將其轉換為 Integer 類型。 因為原始類型不是 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM