您可以使用超类的对象访问子类变量吗?



在下面的代码中,我将 "testmethod() 传递给方法 "testmethod() 一个名为 B 的子类的实例化

不幸的是,该方法的签名接受超类 A 而不是子类 B而且我无法更改该签名,因为它被许多类引用。

有没有办法(在不更改 testmethod() 的签名的情况下)我可以从 testmethod() 中访问 var2 变量,该变量是传递给 testmethod 的对象的一部分?

    public class test5  {
        public static void main(String args[]){
            B b = new B();
            testmethod(b);
        }
        public static void testmethod(A a2 ) {
            System.out.println("in testmeth->" + a2.getVar1() );   // WORKS
            System.out.println("in testmeth->" + a2.getVar2() );   // DOESNT WORK
        }
    }
    class A  {
        int var1 = 2;
        public int getVar1() {
            return var1;
        }
    }
    class B extends A {
        int var2 = 8;
        public int getVar2() {
            return var2;
        }

你可以像这样投射:

if(a2 instanceof B)
  System.out.println("in testmeth->" + ((B) a2).getVar2() );
else
  System.out.println("in testmeth->" + a2.getVar1() );

你可以低调,但这通常不是一个好的做法。

所以它会是

System.out.println("in testmeth->" + ((B) a2).getVar2() );

注意:如果a2不是类B instanceof,则此行将导致ClassCastException

您可以重载该方法,然后在调用时选择最具体的方法。 即:

public class test5  {
    public static void main(String args[]){
        A a = new A();
        B b = new B();
        testmethod(a);
        testmethod(b);
    }
    public static void testmethod(A a2 ) {
        System.out.println("in testmeth_a->" + a2.getVar1() );
    }
    public static void testmethod(B b2 ) {
        System.out.println("in testmeth_b->" + b2.getVar2() );
    }
}

铌。调用的方法取决于声明的类型,而不是传入对象的类型。看这里。

从最小的示例中很难分辨出来,但看起来您可能希望将A变成一个抽象类,这需要B(和任何其他子类)来实现getVar2()。执行此操作时,可以通过任何A实例访问getVar2

abstract class A {
   int var1 = 2;
    public int getVar1() {
        return var1;
    }
    public abstract int getVar2();
}

最新更新