web-gelistirme-sc.com

Java’da bildirim ve tanım arasındaki fark nedir?

İki terim arasında kafam çok karışık. Stackoverflow kontrol ettim ve C++ için benzer bir soru var ama Java için değil. 

Birisi java için iki terim arasındaki farkı açıklayabilir mi?

66
Alan2

Kavramsal fark basittir:

  • Beyanı: Sizler, sınıf, işlev veya değişken gibi bir şeyin var olduğunu {ilan. Ne hakkında o sınıf veya fonksiyonun neye benzediği hakkında hiçbir şey söylemezsiniz, sadece var olduğunu söylersiniz.

  • Tanım: tanımla, bir sınıf, işlev veya değişken gibi bir şeyin nasıl uygulandığını, yani, yani, aslında {ne olduğunu söylüyorsunuz.

Java 'da, ikisi arasında ve resmi olarak konuşursak, arasında yalnızca tanımlayıcıyı değil aynı zamanda tanımı da içeren bir fark yoktur. Burada terimleri kişisel olarak nasıl yorumladım:

  • Sınıflar : Java, açıklamaları ve tanımları C/C++ 'ın yaptığı gibi (başlık ve cpp dosyalarında) gerçekten ayırmaz. Onları ilan ettiğiniz noktada tanımlarsınız.

  • İşlevler : Bir arabirim (veya soyut bir sınıf) yazarken, bir işlev tanımlamayacağınızı, tanımlamadan söyleyebilirsiniz. Bununla birlikte, sıradan fonksiyonlar her zaman beyan edildiği yerde tanımlanır. İsterseniz fonksiyonun gövdesini tanımı olarak görün.

  • Değişkenler : bildirim değişkeni şöyle görünebilir:

    int x;
    

    (x değişkeninin var olduğunu ve int tipinde olduğunu bildirirsiniz) ya yerel bir değişken veya üye alanıysa. Java'da, x - tanımla hakkında geriye kalan hiçbir bilgi kalmamıştır, bunun dışında hangi değerlere sahip olacağı, hangi atamalara göre belirlenir.

İşte terimleri nasıl kullandığımın kaba bir özeti:

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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /
86
aioobe

Java Dil Belirtimi "bildirim" terimini kapsamlı bir şekilde belirtir ve kullanır, ancak normal bir İngilizce Sözcük dışında "tanım" kullanmaz.

Kanıtım, "bildirim" teriminin JLS içindekiler dizininde ve endekste birkaç kez göründüğü, ancak "tanım" kelimesinin de görünmediği yönünde.

Yani, birisinin Java bağlamında "tanımı" kelimesini kullandığını gördüğünüzde, ya teknik olmayan anlamda kullanıyorlar ya da terminolojileri ile özensizleşiyorlar. 

İkinci durumda, might, "beyan" teknik terimiyle aynı şeyi kastediyorlar ya da başka bir şey ifade ediyor olabilirler. Başka bir şey ifade ediyorlarsa, ne anlama geldiklerini sormanız gerekir. Eğer tanımlamışlarsa ... yeterince adil, ama standart terminoloji değil.


"Tanım" ın, değişkenin başlatıldığı noktaya atıfta bulunduğunu gösteren cevaplar Java bağlamında özellikle desteklenemez .... Java'da bir değişkenin başlatılması ya bildirim noktasında ya da daha sonraki bir ödevde gerçekleşir. İkinci durumda, atama ve/veya ilk kullanıma hazırlama dışında özel bir terim ... kullanılmaz veya gerekli değildir. Değişken için depolamanın ayrıldığı bir nokta yoktur. Aslında, şans, değişkenin kendisine verilen alanın önce'e tahsis edilmesiyle bildirime ulaşılır.


"Tanım" teriminin Java’da JLS spesifikasyonunda kullanılmamasının nedeni, buna gerek olmamasıdır. 

  • Java, üyelerin herhangi bir sırayla ilan edilmesine izin verdiğinden, "ileriye dönük beyanlara" gerek yoktur. İki kavramı birbirinden ayırmanın gerekli olduğu bağlam budur.
  • Java'da bir değişken için gerekli olan yığın alanı bir derleme zamanı sabitidir, yani yığın ofset hesaplamaları derleme zamanında gerçekleşir. (Java'da bir dizinin bir yığın nesnesine bir referans olduğunu ve yalnızca referansın yığın çerçevesinde tutulduğunu unutmayın.)
  • Java'nın bir alan veya değişkenin "başlatılmadan tanımını" işleme şekli, tek bir "bildirim" noktası gerektirmez. Bir değişkenin başlatılması gerekiyorsa, kaynak kodunda birden fazla noktada olabilir.

(Java ile tanımlamaya karşı bildirimi kullanabilecekleri tek yer soyut yöntemlerdir. Yapmış olsaydı, bunun düzenli bir yöntem bildirgesine bir tanım olarak başvurması gerekecekti ... kafa karıştırıcı olurdu, bu yüzden onlar sadece "soyut" küçük harf olarak soyut bir yöntem bildirimi diyorlar.)

C ve C++ bu şeyleri farklı şekilde ele alır ve bu nedenle do teknik açıklamalarında farklı "beyan" ve "tanım" terimlerine ihtiyaç duyar. "Güneş Sözlüğü" tanımlarını benim üstüme almam, C/C++-merkezli olmalarıdır.

24
Stephen C

Sun sözlüğünden tanımlarından: 

bildirim: Bir tanımlayıcı oluşturan ve özniteliklerini, depolama alanını (veriler için) ayırmadan veya uygulamayı sağlamadan (yöntemler için) sağlamadan öznitelikleri ilişkilendiren bir ifade. 

definition: Depolamayı saklayan (veriler için) veya uygulama sağlayan (yöntemler için) bir bildiri. 

Güneş Sözlüğünü okuma biçimim şöyle olurdu:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference
5
Jainendra

1. Beyan, a primitive or Object reference variable oluşturma anlamına gelir, ancak sırasıyla değer veya nesne ataması olmadan ..

eg:

          int x;   // declaration of x of type int

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

2. Tanım, onlara değer veya Nesne atadığımız zamandır.

         int x = 5;

         Cat myCat = new Cat();

3. Metod durumunda, bunun gibi ...

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

   public void go(){               // Method Defination

            // Your code      

    }
3

Sanırım bu soruyu şöyle bir şeyle daha iyi açıklayabilirim:

Aşağıdaki senaryoyu düşünün:

Firmanızda yeni bir boş boş yazılım mühendisi var. Bu, bu pozisyonu doldurmayı seçeceğiniz kişinin bir yazılım mühendisi olacağı anlamına gelir (bu yazı için bir pazarlama elemanı seçemezsiniz). Dolayısıyla bu yazıyı oluşturmak bildirime benzer.

Şimdi, bu postaya sahip olan kişinin neler yapabileceğini/yapamayacağını, hangi yetkilere sahip olduğunu, sınırlamaları neler olduğunu tanımladığınızda, buna tanım adı verilir. 

Yani 

SoftwareEngineer se;

deklarasyon anlamına gelir;

ve 

class SoftwareEngineer {

// define role and responsibilities
}

tanım anlamına gelir.

2
me_digvijay

Java dili, yalnızca tanımı kullanmayan bildirimi tanımlar.

Beyan:

class A{}// class declaration

String str;// variable declaration
1
Mohammod Hossain

bildirim : Bir tanımlayıcı oluşturan ve özniteliklerle ilişkilendiren bir ifade, saklanması zorunlu değildir (veri için) veya uygulamayı sağlamadan (yöntemler için). 

         or

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

definition : Depolamayı saklayan (veriler için) veya uygulama sağlayan (yöntemler için) bir bildiri.

        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
0
shraddha patel