你能用超类对象访问子类变量吗?

时间:2016-01-19 17:28:06

标签: java inheritance

在下面的代码中,我将方法“testmethod()传递给A的子类的实例化,名为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;
        }

4 个答案:

答案 0 :(得分:3)

你可以向下倾斜,但这通常不是一个好习惯。

所以它会是

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

注意:如果a2不是instanceof班级B,则此行会产生ClassCastException

答案 1 :(得分:2)

你可以像这样投射:

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

答案 2 :(得分:2)

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

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() );
    }
}

NB。调用的方法取决于声明的类型,而不是传入的对象的类型。请参阅here

答案 3 :(得分:0)

很难从最小的例子中看出来,但看起来你可能想让A成为一个抽象类,需要B(以及任何其他子类)来实现getVar2() 。执行此操作时,getVar2可通过A的任何实例访问:

abstract class A {
   int var1 = 2;

    public int getVar1() {
        return var1;
    }
    public abstract int getVar2();
}