2010-11-28 3 views
0

자바 초보자와 나는 그것을 배우고있다.자바 생성자 함수 초보자 질문

지금 내가, 내가 이미

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 두 개의 클래스를 불렀다 나는이에 사용하고자하는 모든 단일 기능에 B bb = new B();를 초기화해야합니까?

질문 모든 범위에 대한

+0

B에 대한 코드를 표시해야합니다. doFly() 메소드가 있습니까? 아니면 A에서 상속합니까? –

답변

1

그것의 편집. 속성이 클래스 수준에 있으면 아무 것도 매번 새로운 속성을 만들 필요가 없습니다. 속성이 메소드 범위 내에서만 작성된 경우 그렇습니다.

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

그냥 참고 : 모든 속성을 선언하십시오

의 차이는

class A { 

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

클래스 수준 범위가 아니, 단지 식별자 bb를 참조

class A { 

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

    public A() { 

    } 
} 
+0

이전에 그랬지만 "Illegal Forward Reference"오류가 발생했습니다 – SOer

0

입니다 하지 말아야 할 정당한 이유가없는 한 private.

+0

내 질문을 업데이트했습니다. – SOer

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

그런 AA가 문 new A() 생성됩니다 내부 BB 변수. 따라서 이미 존재하는 B 객체를 생성하여 bb로 설정할 필요가 없습니다.

또한 변수를 생성자 외부에서 선언해야합니다. 그렇지 않으면 파리와 같은 다른 메소드에서 변수를 사용할 수 없습니다. 이 문제를 해결하려면 당신이 할 수 있습니다 :

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 
} 

과는 다음과 같이 이루어집니다 : 여기 당신이 그것을 어떻게했는지 당신이 전화 aa.fly()을 할 경우가 있기 때문에 첫 번째 오류는 컴파일시 오류가 발생합니다

public A() 
{ 
    //Insert code here 
} 

을 어느 개인이나 공공의.

두 번째 메서드를 호출하지 않아도 컴파일 타임 오류가 발생합니다.