我是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();
?
编辑问题
答案 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()
,第一个错误将导致编译时错误,因为它既不是私有也不公开。
即使您没有调用该方法,第二个也会导致编译时错误。