Java 从实例调用方法
假设我有两个类,Java 从实例调用方法,java,oop,Java,Oop,假设我有两个类,A和B,它们依次有一些方法,something()和nothing(),在A中创建了B的一个实例,如下所示: public class A { public A() { B b = new B(); b.nothing(); } public void something() { ... } } 调用b.nothing()都是标准的东西,但是有没有什么方法可以通过实例b调用A.something
A
和B
,它们依次有一些方法,something()
和nothing()
,在A
中创建了B
的一个实例,如下所示:
public class A {
public A() {
B b = new B();
b.nothing();
}
public void something() {
...
}
}
调用b.nothing()
都是标准的东西,但是有没有什么方法可以通过实例b
调用A.something()
,假设A
的实例被调用A
。如果不是,为什么这在概念上是错误的
有什么方法可以通过实例b调用a.something()
您无法在方法中找到调用方,因此,否,无法做到这一点
如果不是,为什么这在概念上是错误的?
我立刻想到两个问题:
- 来电者的类型是什么?因为任何人都可以调用
,所以你只能假设它是一个b.nothing()
,这会导致很多难看的向下转换对象
的实现不应该关心谁在呼叫他。如果重构b.nothing()
并将调用移动到A
到其他类,会发生什么?如果b.nothing()
突然停止工作,那将非常令人惊讶b.nothing()
b.nothing()
可以调用a.something()
就是告诉b
的实例关于a
的实例。例如:
b.nothing(this);
其中B.没有什么看起来像:
public void nothing(A a)
{
// Do other stuff
a.something();
}
或者,您可以将构造函数中的此
传递到B
,这将保留引用:
B b = new B(this);
b.nothing();
请注意,在构造函数调用期间让
this
转义通常是一个坏主意-您让B.nothing()
对尚未完全初始化的对象调用a.something()
-其构造函数尚未完成执行。这有时会导致不良和难以诊断的行为。我不认为这在概念上有任何问题
但是,为了使机制工作,b
需要知道调用A
的哪个实例something()
。为此,B
的构造函数或其nothing()
方法需要将A
引用作为参数
示例1:
public class B {
public void nothing(A a) {
...
a.something();
...
}
}
public class B {
private final A a;
public B(A a) {
this.a = a;
}
public void nothing() {
...
this.a.something();
...
}
}
示例2:
public class B {
public void nothing(A a) {
...
a.something();
...
}
}
public class B {
private final A a;
public B(A a) {
this.a = a;
}
public void nothing() {
...
this.a.something();
...
}
}
示例3:
public class B {
public void nothing(A a) {
...
a.something();
...
}
}
public class B {
private final A a;
public B(A a) {
this.a = a;
}
public void nothing() {
...
this.a.something();
...
}
}
还有第三种方法,适用于某些情况。如果B
是A
的一个内部类,则它有一个对其关联的A
实例的隐式引用
public class A {
public void something() { ... }
public class B {
public void nothing() {
...
something();
...
}
}
}为此,
b
需要引用a
。有两种方法可以提供:
B
的构造函数中传递这样一个引用,或者给B
一个合适的setterB
是A
的内部类,那么它隐式地具有这样一个引用为什么不尝试向
B
中的方法添加代码newa().something()
?查看编译器是否抱怨,或者您是否有任何奇怪的运行时行为。@RayToal-这是假设某物()是静态的。在这种情况下,它不是。不,我没有做那个假设。我知道something()
是一种实例方法。我想你误解了我的建议