关于Java继承隐藏的理解

定义

如果在子类中对从父类继承来的成员变量进行重新定义,即出现了子类变量对父类变量的隐藏

隐藏的问题

设定A为父类,B为子类,当B的对象调用父类里面的方法(就是子类里面没有进行重写的方法),且方法里面用到了出现隐藏的变量,则该方法只会调用父类里面的参数变量,不会调子类里面重定义的变量。

 

和重写比较

重写是针对方法而言的,隐藏是针对变量而言。

在子类中,如果子类重写了父类的方法,那么子类在调用时会用重写的方法,即使子类调用父类的方法f方法(这个父类方法里面调用了有被子类重写的方法f1方法),f方法在调用f1时,会用重写后f1。当f调用被子类隐藏的变量(即被子类重定义的参数),会调用父类里面的变量,f1会调用子类重定义的变量。

 

所以:子类继承的方法,只能操作子类继承和隐藏的成员变量。(今天看到的一道面试题)

 

下面段网上的代码帮助理解:

 

publicclass Main {

 

    publicstaticvoid main(String[] args) {

       A a = new A();

       a.printOut();

       System.out.println("------------------------------");

       B b = new B();

       b.printOut();

       System.out.println("------------------------------");

       b.show();

       System.out.println("------------------------------");

       a = b;

       a.printOut();

    }

}

class A{

     inti = 0;

    publicvoid doAdd(){

       i++;

       System.out.println("A.i相加");

    }

    publicvoid printOut(){

       this.doAdd();

       System.out.println("A:"+i);

    }

}

class B extends A{

    publicinti = 0;

    publicvoid doAdd(){

       i+=2;

       //super.i+=2;

       System.out.println("B.i相加");

    }

    publicvoid show(){

       System.out.println(i);

    }

}