2010-11-28 9 views
0

Im newbie en Java et je l'apprends.java constructeur fonction newbie question

En ce moment j'ai deux classes, je l'ai déjà appelé la classe B de classe A constructeur

class A 
public A { 
init(); 
B bb = new B(textField); 
bb.doSomething(); 
} 

void init() { 
    textField = new JTextField(); 
} 

void fly() { 
//can i just use bb.doFly(); 
} 

private JTextField textField; 
} 

Ma question est, dois-je à initialiser B bb = new B(); sur chaque fonction que je veux utiliser sur A?

Question Edité

+0

Vous aurez besoin d'afficher le code pour B - at-il une méthode doFly() ou hérite-t-il de A? –

Répondre

1

Son tout sur la portée. Si votre attribut est au niveau de la classe, alors vous n'êtes pas obligé d'en créer un nouveau à chaque fois. Si l'attribut est créé uniquement dans une étendue de méthode, alors oui.

La différence est

class A { 

    public A() { 
     // this is at method level scope. It is define INSIDE a method 
     B bb = new B(); 
    } 
} 

portée de niveau de classe est

class A { 

    // this is at class level scope. It is define OUTSIDE a method 
    B bb = new B(); 

    public A() { 

    } 
} 
+0

Je l'ai fait plus tôt, mais il y avait erreur "Illegal Forward Reference" – SOer

0

Non, juste se référer à l'identifiant bb:

public class A { 
    private B bb = new B; 

    public A() { 

    } 

    public void foo() { 
     bb.printHello(); // you can only call methods on bb which class B supplies 
     bb.fly();  // won't work; you can only call fly() on objects of type A 
    } 

    public void bar() { 
     bb.printWorld();  
    } 

    public void fly() { 
     System.out.println("I'm flying..."); 
    } 
} 

public class B { 
    public B() { 

    } 

    public printHello() { 
     System.out.println("Hello"); 
    } 

    public printWorld() { 
     System.out.println("Hello"); 
    } 
} 

Juste une note: S'il vous plaît déclarer tous vos attributs private sauf si vous avez une bonne raison de ne pas le faire.

+0

J'ai mis à jour ma question – SOer

0

class A
B bb;
public A {
bb = new B();
bb.doSomething();
}

void fly() {
bb.something()
}
}

0

n ° Supposons que vous ayez ce code ce code:

public class NameOfProgram 
{ 
    public static void main(String[] args) 
    { 
     A aa = new A(); 
     aa.fly(); 
    } 
} 

la variable bb aa l'intérieur est créé avec l'new A(). Ainsi, vous n'avez pas besoin de créer un objet B et de le définir sur bb tel qu'il existe déjà.

De même, vous devez déclarer la variable en dehors du constructeur ou vous ne pourrez pas l'utiliser dans d'autres méthodes, telles que fly. Pour le corriger, vous pouvez le faire:

public class A 
{ 

    B bb; <----------------- 

    public A() 
    { 
     bb = new B(NameOfVariableIForgotAbout); 
    } 

    public void fly() 
    { 
     bb.doFly() //Now this should work 
    } 
} 

vous pouvez aussi mais le B bb; après la méthode, je préfère cette façon.

En outre, votre classe A a quelques erreurs (donc vous notez pour référence future). Tout d'abord, si vous voulez être en mesure d'appeler une méthode à partir d'une instance de la classe (A aa = new A(); aa.fly()) alors vous devez rendre les méthodes publiques comme ceci:

public void fly() 
{ 
    //Insert code here 
} 

En outre, vous avez déclaré le constructeur à tort. Voici comment vous l'avez fait:

public A 
{ 
    //Insert code here 
} 

et il se fait comme suit:

public A() 
{ 
    //Insert code here 
} 

La première erreur provoquera une erreur de compilation si vous faites l'appel aa.fly() car il est ni privé, ni Publique. La deuxième provoquera une erreur de compilation même si vous n'appelez pas la méthode.