关于Java中子类调用父类方法

https://blog.csdn.net/twilight_karl/article/details/53494296

本人在查看上面的文章的时候,发现,并不理解上面的输出情况。所以重新写了一篇文章进行解释。

代码如下。

package Temp;

class A {
    int x = 6;
    private int y = 2;

    public A(int a) {
        x = a;
    }

    int getz() {
        int z;
        z = x / y;
        return z;
    }

    void show() {
        System.out.println("x=" + x);
        System.out.println("y=" + y);
        System.out.println("z=" + getz());
    }
}

class B extends A {
    int x = 3, y = 5, z;

    public B(int a) {
        super(a);
    }

    int getz() {
        z = x + y;
        return z;
    }
}

public class Temp {
    public static void main(String[] args) {
        A num1 = new A(10);
        B num2 = new B(9);
        num1.show();
        num2.show();
    }
}

输出结果如下

x=10
y=2
z=5


x=9
y=2
z=8

首先第一组的输出情况是非常好理解的。因为他生成A类一个对象num,因此该对象使用show函数的时候,就会产生如上的情况。

 

下面我们来解释一下为什么第二组的输出结果是这样?

如果看不懂下面我的解释的同学,可以把B类中的,x,y,z全部替换成a,b,c。其实一下你就可以明白怎么回事。如果你懂了也就不需要往下看了。

解释下x:

B num2 = new B(9);

该语句产生一个B的对象,然后初始的数据是9,就会调用他的构造函数。

其中,super()函数的作用就是调用他的父类的构造函数。下面我们来看一下。他父类的构造函数是什么?

该函数的作用是给,父类A中的变量x进行赋值。一定要注意你改变的是父类A中的x,并不是你在B类中定义的那样。

你B类中的x还是他初始化的3,改变的是A类中,也就是继承自A的x的值。

 

解释下y:

有人可能会认为,y的值应该是5,因为B类在继承的时候,私有的成员 不可以被继承,那么y就应该是B类中,定义的那个数字5.

首先,是的,private是不会被继承,也就是说,B从A继承的member其实只有x一个,没有y。也就是说,在num2中,所有的member一共有4个,继承A 的x=9,本身定义的x=3,y=5,z=5。

如果你使用num2.y就会发现,他的数字是5,不是我们现在看到的数字2.

现在我们明确了,B中的member都是什么之后,我们看下输出结果。

首先show函数,在B中是没有的,也就是要继承的。也就是使用下面这个代码。

但是要注意,继承,你可也理解为把这个代码相当于放在你的函数中,只要是public等修饰的时候,你可以随意使用。

但是其中的x,y和函数getz()你要理解好含义。

就像上面我所提到的,如果你把B中的xyz,替换成abc。你就会发现。这个函数它其实输出的是x和y,并不是B中的ab。这也就解释了为什么它的结果不是3和5。

同时,因为getZ()函数已经被重写,如果使用B的对象num2去调用函数show(),系统会自动调用子类,也就是 被重写后的函数,也就是代码

但是一定要注意,调用这个函数后,其中的x,y。是B类中的x,y。也就是a,b。为什么呢?

首先,当你把字母变成ab后,你会很清楚的看到,这个函数中用的是B类定义的xy(ab),而不是继承的A类的。

那么你把字母就算换成一样的,先不说什么同名隐藏的问题。你定义的函数中使用的变量,会现在你定义的类中找,如果找不到才会去父类中找。也就是这样原因,就算他写z = x + y,使用的也是int x = 3, y = 5, z;中的数据,所以值是8.而不是其他数字

 

另外我在说下,x的数值,在输出的时候,他输出的是A中定义的x,而不是B中定义的x。是因为,show函数是父类的,该函数中在A定义的时候,里面的x,y指的就是A类中的x,y。因为那个时候也还没有B呢。就算被B继承了,他指的还是A类的x,y。

但是如果你把下面的代码,加到B中,不使用继承的方法使用该函数,那么你得到的结果就是x = 3,y = 5,z = 8;

下面我再说下隐藏的问题,

如果子类,继承自父类,但是members中,有同名的变量,那么父类中的 变量会被隐藏,注意不是覆盖,因此系统还是会为父类中的实例变量进行开辟空间,只是在B中也就是子类中,使用同名变量xyz的时候,使用的是子类B中的,其实和函数重写后,函数会覆盖父类的函数,含义差不多。这也是为什么,如果把上面的代码加到B类中,输出结果为什么是x = 3,y = 5,z = 8;的原因

 

还有一个需要注意的是:

每个继承了这个变量的子类,相当于拷贝了一份变量,对变量的修改影响也仅限于自身,不会影响到父类的变量值,更不会影响到其他子类对应的变量值。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值