定义
如果在子类中对从父类继承来的成员变量进行重新定义,即出现了子类变量对父类变量的隐藏
隐藏的问题
设定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); } } |