jre - java更新




Java中的聲明和定義有什麼區別? (6)

我對這兩個術語感到很困惑。 我檢查了stackoverflow,對於C ++有一個類似的問題,但對於java則沒有。

有人可以解釋java的兩個術語之間的區別嗎?


  1. 對於對像或原語

聲明 :指定對像或基元的類型

定義 :指定對像或基元的

  1. 對於一種方法

聲明 :指定方法的簽名

定義 :指定方法的實現


Java語言規範廣泛地指定和使用術語“聲明”,但除了作為普通英語單詞之外,它不使用“定義”。

我的證據是,“聲明”一詞在JLS目錄和索引中出現多次,但“定義”一詞也沒有出現。

因此,當你看到有人在Java的上下文中使用“定義”這個詞時,他們要么是在非技術意義上使用它,要么是他們的術語草率。

在後一種情況下,它們可能與技術術語“聲明”的含義相同,或者它們可能意味著其他內容。 如果他們意味著別的東西,你需要問他們他們的意思。 如果他們已經定義了......公平,但它不是標準術語。

在Java的上下文中,聲明“定義”指的是初始化變量的點是特別不可支持的答案。 在Java中,變量的初始化要么在聲明點發生,要么在稍後的賦值中發生。 在後一種情況下,除了賦值和/或初始化之外,沒有使用特殊術語......或者需要... 沒有為變量分配存儲的指定點。 實際上,可能是達到聲明之前分配變量本身的空間。

在JLS規範中Java中沒有使用“定義”術語的原因是它不需要。

  • 由於Java允許以任何順序聲明成員,因此不需要“前向聲明”。 在這種情況下,有必要區分這兩個概念。
  • 在Java中,變量所需的堆棧空間是編譯時常量,因此堆棧偏移計算在編譯時發生。 (請記住,在Java中,數組是對堆對象的引用...並且只有引用保存在堆棧框架中。)
  • Java處理字段或變量的“無需初始化的定義”的方式不需要單個“聲明”點。 如果需要初始化變量,則可能發生在源代碼中的多個點。

(Java中唯一可能使用聲明與定義的地方是抽象方法。除非他們已經完成,否則必須將常規方法聲明作為定義引用...以保持一致性......會讓人感到困惑。所以他們只是將“抽象”子句稱為抽象方法的聲明。)

C和C ++以不同的方式處理這些事情,因此在技術描述中需要不同的“聲明”和“定義”術語。 我對“太陽詞彙表”定義的看法是它們是C / C ++中心的。


1.聲明意味著創建一個primitive or Object reference variable ,但沒有分別賦值或對象。

例如:

          int x;   // declaration of x of type int

          Cat myCat;  //  declaration of myCat an Object of type Cat

2.定義是指我們為它們分配值或對象。

         int x = 5;

         Cat myCat = new Cat();

3.如果是Method,就像這樣......

public abstract void go();       // Method Declaration (Abstract method)

   public void go(){               // Method Defination

            // Your code      

    }

聲明 :建立標識符並將屬性與其關聯的語句,無需保留其存儲(用於數據)或提供實現(用於方法)。

         or

         1. Declaration means creating a primitive or Object reference variable, 
         but with no assignment of value or object respectively..

定義 :保留存儲(用於數據)或提供實現(用於方法)的聲明。

        or

         Defination is when we assign values or Object to them.

**Ex:** 
List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

我想我可以更好地解釋這個問題:

考慮以下情況:

您公司的軟件工程師有一個新的空缺職位。 這意味著您選擇填補此職位的人將是一名軟件工程師(您不能為此職位選擇營銷人員)。 所以創建這個帖子類似於聲明。

現在,當你定義這篇文章的人能夠/不能做什麼,他有什麼權限,他的局限性是什麼時,這就叫做定義。

所以說

SoftwareEngineer se;

宣言;

class SoftwareEngineer {

// define role and responsibilities
}

意思是定義。 希望它能幫到你。


概念上的區別很簡單:

  • 聲明 :您聲明存在某些內容,例如類,函數或變量。 你沒有說出那個類或函數的樣子,你只是說它存在。

  • 定義 :您定義某些內容的實現方式,例如類,函數或變量,即您說實際的內容。

在Java中 ,兩者之間幾乎沒有區別,而且從形式上講,聲明不僅包括標識符,還包括它的定義。 以下是我個人對這些術語的詳細解釋:

  • :Java並不像C / C ++那樣真正地分隔聲明和定義(在頭文件和cpp文件中)。 您可以在聲明它們的位置定義它們。

  • 函數 :當您編寫接口(或抽像類)時,您可以說您正在聲明一個函數,而不是定義它。 但是,普通函數總是在聲明它們的地方定義。 如果您願意,請將函數體看作其定義。

  • 變量 :變量聲明可能如下所示:

    int x;

    (如果它是局部變量或成員字段,則表示變量x存在且類型為int )。 在Java中,沒有關於x定義的信息 ,除了它應該保持的值,可能由它的賦值決定。

以下是我如何使用這些術語的粗略總結:

abstract class SomeClass {                // class decl.
                                          //                           \
    int x;                                // variable decl.            |
                                          //                           |
    public abstract void someMethod();    // function decl.            |
                                          //                           |
    public int someOtherMethod() {        // function decl.            |
                                          //                           | class
        if (Math.random() > .5)           // \                         | def.
            return x;                     //  |  function definition   |
        else                              //  |                        |
            return -x;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /






java