Java对象切片混乱

时间:2017-03-04 22:43:41

标签: java

我有一个基类和驱动类(继承基类)。而我的基础类是驱动类的对象。因此,当我调用重写函数时,它通过调用驱动类函数给我正确的结果,因为基类具有驱动类对象。 但是当我只是打印基类和驱动类(具有相同名称)中存在的变量时,它会打印基类中存在的变量的值。有没有办法可以打印驱动器类变量。

    this.registers = new ArrayList<Supplier>();
    for (int i = 0; i < this.numberOfSuppliers; i++) {
        Supplier supplier = new Supplier();
        supplier.setSupplierNumber(i);
        supplier.setMaterials(new ArrayList<Warehouse>());
        this.registers.add(supplier);
    }

输出是: -

class A
{
    int i = 10;

    public void func(){
        System.out.print("print i :  " +i);
    }
}

class B extends A
{
    int i = 20;
    public void func(){
        System.out.print("print i :  " +i);
    }
}

class MainClass
{
    public static void main(String[] args)
    {
        A a = new B();

        System.out.println(a.i);
        a.func();
    }
}

3 个答案:

答案 0 :(得分:1)

 a.i

您正在引用基类。基类有“i”,你引用它,得到10。

 a.func()

第二个输出给出20因为函数得到最接近的范围i,它隐藏了基类i。

答案 1 :(得分:0)

每个类都有自己的i实例。如果您希望Bi继承A,则需要从int i = 20中删除B。如果要在构造新i时初始化B,请在构造函数中执行此操作。

public B(int i) {
    this.i = i;
}

但是,如果您不想这样做,并希望从父类访问i,您可以通过说super.i来引用它。

class B extends A
{
    int i = 20;
    public void func(){
        System.out.print("print i :  " + super.i);
    }
}

答案 2 :(得分:0)

你可以实现一个方法(“getter”)并覆盖它,或者你可以使用关键字“super”访问超类'变量:

System.out.println(super.i);