如果我在子类中有一个方法要求超类的对象,我如何区分两者?



我的意思是,如果我有A obj1 = new B(); A obj2 = new B();,我想知道如何为两个对象调用相同的方法,并且还想知道如何知道哪个对象正在调用该方法以及何时调用该方法:

例如,假设我的类层次结构如下所示:

abstract class A {
public void method_1() {
//Do something
}
}
class B extends A {
public boolean method_2(A obj) { 
//Do something
}
}

如果我在哪里做obj1.method_2(obj2);我如何在method_2()内部编码时,obj1obj2调用method_1(),区分哪个obj正在调用该方法?

我希望我的问题足够清楚。 如果我的英语不够容易理解,我提前道歉。

obj1 是 B 的实例,但引用类 A,无法访问method_2 所以你需要像这样投射

((B) obj1).method_2(obj2);

或者您可以将引用更改为 B 而不是 A

B obj1 = new B();

基引用不能调用子项的方法。

public class Main {
public static void main(String arg[] ) {
A obj1 = new A() {};
A obj2 = new B();
B obj3 = new B();
obj1.method_1("1 "+obj1.getClass());
obj2.method_1("2 "+obj2.getClass());
obj3.method_1("3 "+obj3.getClass());
obj3.method_2(obj1);
obj3.method_2(obj2);
}
}

abstract class A {
public void method_1(String className) {//Do something
System.out.println("A.method_1() called by "+className);
}
}

class B extends A {
public boolean method_2(A obj) {//Do something
super.method_1("4 "+obj.getClass());
obj.method_1("5 "+obj.getClass());
return true;
}
}

不能创建类 A 的对象作为其抽象类。但是,您可以创建 B 的对象,并在 method_2(( 中将其传递到代替 A 的位置。当你在 method_2(( 中调用 method_1(( 时,你仍然通过类 B 的对象调用它。这是我根据对您的问题的理解可以编写的测试程序 -

public class App {
public static void main(String[] args) {
B b = new B();
B b2 = new B();
b.method_2(b2); //Or
//b.method_2((A)b2);
}
}
abstract class A {
public void method_1() {
System.out.println("In method_1 = " + this.getClass());
}
}
class B extends  A {
public boolean method_2(A a) {
System.out.println("In method_2 = " + this.getClass());
a.method_1();
return false;
}
}

结果是这两个方法都由类 B 的对象调用。你可以用 getSuperClass(( 方法来获取超类名。