2010-11-28 3 views
0

Im новичок в Java и им учится.java constructor function новичок вопрос

Прямо сейчас у меня есть два класса, я уже называется класс B на классе Конструктор

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; 
} 

Мой вопрос, мне придется инициализировать B bb = new B(); на каждой отдельной функции я хочу использовать на А?

Вопрос Отредактированный

+0

Вам нужно будет показать код для B - есть ли метод doFly() или он наследует от A? – 2010-11-28 12:11:53

ответ

1

все о объеме. Если ваш атрибут находится на уровне класса, тогда вам не нужно создавать новый каждый раз. Если атрибут создан только в пределах области метода, тогда да.

Разница простор уровень

class A { 

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

класс

class A { 

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

    public A() { 

    } 
} 
+0

Я сделал это раньше, но была ошибка «Недопустимая ссылка» – SOer 2010-11-28 12:16:26

0

Нет, просто обратитесь к идентификатору 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"); 
    } 
} 

Просто примечание: Пожалуйста декларировать все свои атрибуты private, если у вас нет веских причин не делать этого.

+0

Я обновил свой вопрос – SOer 2010-11-28 12:25:04

0

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

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

0

Нет. Предположим, что у вас есть этот код этот код:

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

Тогда переменная бб внутри аа создается с утверждением new A(). Таким образом, вам не нужно создавать объект B и устанавливать его на bb, поскольку он уже существует.

Кроме того, вам нужно объявить переменную вне конструктора, иначе вы не сможете использовать ее в других методах, например fly. Чтобы исправить это, Вы можете сделать это:

public class A 
{ 

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

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

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

вы также можете, но B bb; после метода, я просто предпочитаю это таким образом.

Кроме того, ваш класс A имеет несколько ошибок (поэтому вы обратите внимание на последующую ссылку). Во-первых, если вы хотите, чтобы иметь возможность вызвать метод из экземпляра класса (A aa = new A(); aa.fly()), то вам необходимо сделать методы общественного так:

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

Кроме того, вы объявили конструктор неправильно. Вот как вы это сделали:

public A 
{ 
    //Insert code here 
} 

и это делается так:

public A() 
{ 
    //Insert code here 
} 

Первая ошибка приведет к ошибке компиляции, если вы сделаете вызов aa.fly(), потому что она не является ни частной, ни общественности.

Вторая причина ошибки компиляции, даже если вы не вызываете вызов метода.