我在一个包中有3个班级。第一个类(ClassStart
)生成其他2个类(ClassA
和ClassB
)的每个实例。我想通过ClassB
通过其实例" a"来调用ClassA
方法。{
虽然Instance" a"的范围是包(因为"ClassA a;"
中的属性ClassStart
,行"a.showText()"
无法正常工作。它会收到错误消息"a cannot resolved"
。
所以我尝试了"s.a.showText()"
,但它没有用,因为实例" s"是以静态方法生成的,我不知道如何访问" s"。
第一个类(包含main方法):
public class ClassStart {
ClassA a;
public static void main(String[] args) {
ClassStart s = new ClassStart();
}
public ClassStart() {
a = new ClassA();
ClassB b = new ClassB();
}
}
第二节课:
public class ClassA {
public void showText() {
System.out.println("This text comes from ClassA.");
}
}
第三课:
public class ClassB {
public ClassB() {
a.showText();
}
}
如何在ClassB中调用方法" showText()" ClassA?
(我在这个论坛上找到了答案,但我没有找到像这样的三类问题的答案。)谢谢你的回答。
答案 0 :(得分:2)
如果ClassA对象需要始终相同,则将其传递给B:
public class ClassB {
private ClassA a;
// pass the ClassA reference into the ClassB constructor
public ClassB(ClassA a) {
this.a = a; // assign it to the a field
// a.showText(); // or you can do this if you need it called in the constructor
}
// or do this if you want the a method called in a ClassB method.
public void callAShowText() {
a.showText();
}
}
然后:
public class ClassStart {
ClassA a;
public static void main(String[] args) {
ClassStart s = new ClassStart();
}
public ClassStart() {
a = new ClassA(); // create your ClassA instance
ClassB b = new ClassB(a); // pass it into your ClassB instance
b.callAShowText();
}
}
这里理解的关键是理解引用类型和引用变量。您希望ClassB中的引用变量引用在ClassStart中创建的ClassA对象。一种方法是在对象的构造函数或setter方法中将对象传递给ClassB。一旦你完成了,那么ClassB就有了它需要的引用,它可以调用实例上的任何ClassA方法。
请注意,你也可以解决"这可以通过创建和使用公共静态ClassA变量或公共静态showText()
方法来实现,但一般情况下你会尝试避免这样做,因为虽然在这样的简单例子中它可以正常工作,但它并没有"刻度"好吧,这意味着如果通常在更大的更复杂的程序中使用,则会增加复杂程序中潜在连接的风险,从而大大增加了错误的风险。正是出于这个原因,降低了复杂性并降低了创建面向对象编程的连通性(减少耦合)。
答案 1 :(得分:2)
使方法成为静态:
public static void showText()
然后叫它:
ClassA.showText();