java构造函数新手问题

时间:2010-11-28 12:07:03

标签: java

我是Java的新手,我正在学习它。

现在我有两个类,我已经在A类构造函数上调用了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;
}

我的问题是,我是否必须在我想要在A上使用的每个函数初始化B bb = new B();

编辑问题

4 个答案:

答案 0 :(得分: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() {

   }
}

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

没有。假设你有这段代码:

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

然后使用语句new A()创建aa中的变量bb。因此,您不必创建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(),第一个错误将导致编译时错误,因为它既不是私有也不公开。

即使您没有调用该方法,第二个也会导致编译时错误。