33 votes

Différence entre le nouveau Test () et le nouveau Test () {}

Quelle est la différence entre ces deux façons d'instancier de nouveaux objets d'une classe comme suit:

 Test t1=new Test();
Test t2=new Test(){ };
 

Lorsque j'ai essayé le code suivant, j'ai pu voir que les deux objets pouvaient accéder à la méthode foo() , mais t2 ne peut pas accéder au variable x ( variable x ne peut pas être résolu):

 public class Test
{ 
    int x=0;
    public void foo(){ }

    public static void main (String args[])
    {
        Test t1=new Test();
        Test t2=new Test(){ };
        t1.x=10;
        t2.x=20;
        t1.foo();
        t2.foo();
        System.out.println(t1.x+" "t2.x);
    }
}
 

61voto

eatSleepCode Points 1178

Test t2=new Test(); permettra de créer l'objet de la classe de Test.

Mais Test t2=new Test(){ }; permettra de créer un objet de la sous-classe de test (c'est à dire anonyme intérieur de la classe dans ce cas).

vous pouvez fournir de la mise en œuvre de la méthode, là-bas comme

Test t2=new Test(){ 
public void foo(){ System.out.println("This is foo");}
};

de sorte que, lorsque foo() méthode dite de l'objet t2 il permet d'imprimer This is foo.

Plus

Erreur de compilation dans votre code est en raison du manque de concatination opérateur

System.out.println(t1.x+" "+t2.x);
                          ###

16voto

Rohit Jain Points 90368

Le moteur d'exécution de type à la fois les références seraient différentes. Essayez:

System.out.println(t1.getClass());  // class Test
System.out.println(t2.getClass());  // class Test$1

Vous pourrez voir les différentes sortie. Raison d'être, new Test() { } expression crée instance d'un anonyme sous-classe de la Test. Donc, Test$1 est une sous-classe de Test.

Maintenant, la raison pour laquelle vous obtenez cette erreur, vous êtes en manque un à l' + signe:

System.out.println(t1.x + " " + t2.x);
                              ^

Vous pouvez trouver plus de détails sur ce poste, et ce post

5voto

Ankur Shanbhag Points 4125
 test t1=new test();
 

Cela va créer une nouvelle instance de la classe test

 test t2=new test(){ };  
 

Il s'agit d'une classe interne anonyme qui étend la classe test

5voto

Abimaran Kugathasan Points 12318
 Test t1=new Test();
 

Ici, vous créez une instance de la classe Test et l'avez affectée à t1

 Test t2=new Test(){ };
 

Ici, vous avez créé une sous-classe anonyme de Test et l'instanciez et l'attribuez à t2

Et, vous avez fait une erreur ici dans la ligne suivante, corrigé, vous avez manqué +

 System.out.println(t1.x + " " + t2.x);
 

4voto

Oliver Points 500

a)

 Test t1=new Test();

En faisant cela, vous créez un Objet de la classe de Test en appelant le constructeur par défaut

b)

Test t2=new Test(){ };

Et en faisant cela, vous créez un objet d'une classe qui étend la classe de Test, cette classe n'a pas de nom et d'où il est appelé "Anonyme Intérieur de la Classe" par exemple.

     Test t2=new Test(){ 
// this is the body of the anonymous(un-named) class 
//you can overide the method foo() here
// you can write more methods here but you will not be able to call them 
// for example
public void doSomething(){}
};

doSomething() n'est pas accessible de l'extérieur, comme t2-je.e de référence(pointeur) de cet objet(objet de anonyme intérieure classe qui étend la classe de Test) comprend seulement foo() méthode référence de la classe parent

doSomething() peut être appelée que si vous faites cela,

  Test t2=   new Test(){
            public void foo()
            {
              doSomething();


            }
            public void doSomething(){
                  System.out.println("Do Something");
            }

        };

c'est à dire explicitement appel doSomething() foo() et foo() est accessible à l'extérieur

t2.foo();

Remarque: Veuillez écrire le nom de la classe correctement, la première lettre de la classe doit être le capital comme

public class Test{}

Lorsque vous commencez à écrire d'énormes morceaux de code, il va vous aider, vous et les autres car il rend votre code Lisible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X