Java中子类和父类中出现重名变量和重名方法的问题解释

  • Post author:
  • Post category:java




继承时子类和父类中出现重名变量和重名方法问题的解释



1.成员变量同名

public class Test2 {
    public static void main (String[] args) {
        ZI zi = new ZI();
        FU fu = new FU();
        System.out.println(zi.a);
        System.out.println(fu.a);
    }
}
class FU{
    int a=10;
}
class ZI extends FU{
    int a=20;
}
/*
输出结果为20  10
*/
public class Test2 {
    public static void main (String[] args) {
        ZI zi = new ZI();
        zi.show();
    }
}
class FU{
    int a=10;
    public void show(){
        System.out.println(a);
    }
}
class ZI extends FU{
    int a=20;
}
/*
输出结果为10
*/
public class Test2 {
    public static void main (String[] args) {
        ZI zi = new ZI();
        zi.show();
    }
}
class FU{
    int a=10;

}
class ZI extends FU{
    int a=20;
    public void show(){
        System.out.println(a);
    }
}
/*
输出结果为20
*/

由上述代码显示可以看出,当继承时子类和父类中出现用名成员变量时,同名变量之间相互独立;如果是直接获取时只需依据对象类型即可;如果进行调用时依据方法定义在哪个类中,父类中进行父类调用,子类中进行子类调用。



2.成员方法同名时

public class Test2 {
    public static void main (String[] args) {
        ZI zi = new ZI();
        zi.show();
        zi.A();
        FU fu = new FU();
        fu.show();
        fu.A();
        FU fu1=new ZI();
        fu1.show();
        fu1.A();
    }
}
class FU{
    public void A(){
        System.out.println("A方法");
    }
   public void show(){
       System.out.println("FU SHOW");
   }
}
class ZI extends FU{
    public void show(){
        System.out.println("ZI SHOW");

    }
}
/*
输出结果为
ZI SHOW
A方法
FU SHOW
A方法
ZI SHOW
A方法
*/

注:FU为父类对象,ZI为子类对象,FU1为用子类实例化的父类对象(实现向上转型)

上述代码实现的功能可得:父类对象和子类对象可以调用本类中的对象;子类中没有但是父类中有的方法会实现继承;在实现向上转型后,子类和父类中重名的方法将会被子类重写后的方法所覆盖(方法重写),不重名的方法将会得到子类的继承,当测试类中进行方法调用时,方法会以重写后的方法为准进行调用。



总结

继承只能覆盖方法(方法重写),而不能覆盖成员变量,当有同名变量时,则变量之间相互独立,直接获取变量时,依据变量前的对象类型进行获取,调用时依据对象在哪个类中进行调用。

方法一旦进行重写,再次被调用时均以重写后的方法为准,进行执行。

用子类对父类对象进行实例化(即多态或者向上转型)是基于继承和子类对父类方法的重写而实现的。无继承和方法的重写,多态则无从谈起。



版权声明:本文为DONG__CHI原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。